CMake:具有多个项目的静态库

Posted

技术标签:

【中文标题】CMake:具有多个项目的静态库【英文标题】:CMake: Static library with multiple projects 【发布时间】:2013-03-15 02:43:39 【问题描述】:

我有两个使用 CMake 的项目。项目 A 构建一个静态库,然后链接到项目 B。问题是,当我从项目 A 更改源文件并构建两个项目时,项目 B 不会再次自动链接。如何将项目 A(静态库)的输出添加到项目 B?

编辑:这是我的问题的一个例子:

ProjectA CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
PROJECT(PROJECTA)

ADD_LIBRARY(projectA STATIC "src/foo.cpp")

ProjectB CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
PROJECT(PROJECTB)

set(PROJECTA_DIR $CMAKE_CURRENT_SOURCE_DIR/../ProjectA)
include_directories($PROJECTA_DIR/include)

link_directories($PROJECTA_DIR/build)

ADD_EXECUTABLE(projectB "src/main.cpp")
target_link_libraries(projectB projectA)

重现问题:

    构建两个项目(需要先构建 ProjectA)。 更改项目A/src/foo.cpp 构建 ProjectA(它将更新 libProject.a) 构建 ProjectB(它不会将可执行文件与新的 libProject.a 链接,而是假定未进行任何更改并且什么也不做)。

【问题讨论】:

你能展示所涉及的 CMakeList(s) 吗? Angew:我在我的问题中添加了一个示例。 这些 CMakeList 是完全独立的,还是它们都是一个“父”CMakeList 的子目录? Angew:它们是完全独立的。 您也可以尝试删除link_directories()(已被弃用)并使用target_link_libraries() 中的完整路径。这可能会有所帮助,但不确定。 【参考方案1】:

把我的 cmets 变成一个答案。

通常,当 CMake 项目必须合作时,使用 add_subdirectory() 使它们成为同一构建系统的一部分是有益的。这样,CMake 可以跟踪其目标之间的依赖关系,自动解析对逻辑目标名称的引用等。

如果这不是您的选择,您至少应该删除 link_directories() 并使用 target_link_libraries() 中的库的完整路径。通常不鼓励使用link_directories(),因为它会导致问题。

【讨论】:

以上是关于CMake:具有多个项目的静态库的主要内容,如果未能解决你的问题,请参考以下文章

在 CMake 中安装静态库的调试和发布配置

如何使用cmake生成基于静态库的动态链接库

vs+cmake+使用静态库

vs+cmake+使用静态库

如何理解CMake文档,优先静态库,Cuda混编

CMake C++ 包含静态系统库到项目 - 如何