首页 文章

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

提问于
浏览
3

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

EDIT: 这是我的问题的一个例子:

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) .

  • 更改ProjectA / src / foo.cpp

  • 构建ProjectA(它将更新libProject.a)

  • 构建ProjectB(它不会将可执行文件与新的libProject.a链接起来,而是假设没有进行任何更改并且什么都不做) .

1 回答

  • 7

    把我的评论转化为答案 .

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

    如果这不适合您,您至少应删除 link_directories() ,而是使用 target_link_libraries() 中库的完整路径 . 通常不鼓励使用 link_directories() ,它会引起问题 .

相关问题