静态库子目录与包含路径之间的依赖关系

时间:2017-06-24 20:55:21

标签: c++ cmake static-libraries dependency-management

我正在开发一个项目,该项目由一个与两个库链接的可执行文件组成 我经常对所有人进行调查,并且不想为libAlibB进行myProject ├── libA │   ├── CMakeLists.txt │   ├── include │ │   └── libA │ │ └── *.h │   └── src │ └── *.cpp │ ├── libB │   ├── CMakeLists.txt │   ├── include │ │   └── libB │ │ └── *.h │   └── src │ └── *.cpp │ ├── CMakeLists.txt ├── include │ └── *.h └── src └── *.cpp 周期,所以我按照以下方式将它们排除在外:< / p>

libA

我正在使用CMake子目录自动将libBmyProject链接到CMakeList.txt,它运行正常。 # myProject/CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(myProject) add_subdirectory(libA) add_subdirectory(libB) # Compiler flags, listing of the source files into ${SOURCE_FILES}, etc. add_executable(myProject ${SOURCE_FILES}) target_link_libraries(myProject libA libB) 的设置如下:

# myProject/libA/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(libA)

# Compiler flags, listing of the source files into ${SOURCE_FILES}, etc.

add_library(libA STATIC ${SOURCE_FILES})
target_include_directories(libA PUBLIC include)

install(
    TARGETS libA
    ARCHIVE DESTINATION lib
)

install(
    DIRECTORY include/glk
    DESTINATION include
)
myProject/libB/CMakeLists.txt

libB类似。

现在问题是:libA依赖于libA,并且#include <libA/foo.h>包含libA的标题,并且需要来自libB的符号在链接时(虽然我猜这对静态库来说不是问题)。

如何正确设置此依赖关系,以便libA找到有关此本地myProject所需的所有内容,最好只修改{{1}}的配置?

1 个答案:

答案 0 :(得分:2)

您需要在libB上指定libA的链接相关性。是的,它们可能是静态库,但CMake允许您指定将一个库链接到另一个库,即使它们是静态的。在库是静态的情况下,这种链接关系仅用于提供目标之间的传递依赖性(即,在各种target_...命令中作为PUBLIC或INTERFACE项提供的那些)。所以我希望你的libB的CMakeLists.txt看起来类似于libA',除了你还要添加以下行:

target_link_library(libB PRIVATE libA)

或者如果libB在其自己的公共API中使用libA的部分内容,请将上述链接依赖项PUBLIC而不是PRIVATE。通过执行此操作,在您与libB建立目标链接的任何位置,CMake将确保在最终命令行后显示libA。在您的示例中,顶级CMakeLists.txt文件在libB之后链接libA,因此如果没有上述target_link_library()关系,链接器会抱怨libA中的符号丢失,即使libA已经在链接器命令行上,只是顺序错误。您的顶级CMakeLists.txt文件中target_link_libraries()的语法也不正确(可能只是您示例中的拼写错误)。参数不应以逗号分隔。

明确地将libBlibA关联起来的另一个影响是现在libBlibA获取PUBLIC和INTERFACE属性,在这种情况下将是标题搜索libA定义的路径。您应该会发现libB现在也会找到libA的标题。

相关问题