2017-06-24 22 views
0

我正在处理由两个库链接的一个可执行文件组成的项目。
我正在频繁chages到所有的人,不希望去虽然sudo make install周期libAlibB,所以我用以下方式摆开:静态库子目录和包含路径之间的依赖关系

myProject 
├── libA 
│   ├── CMakeLists.txt 
│   ├── include 
│ │   └── libA 
│ │  └── *.h 
│   └── src 
│  └── *.cpp 
│ 
├── libB 
│   ├── CMakeLists.txt 
│   ├── include 
│ │   └── libB 
│ │  └── *.h 
│   └── src 
│  └── *.cpp 
│ 
├── CMakeLists.txt 
├── include 
│ └── *.h 
└── src 
    └── *.cpp 

我使用CMake子目录自动链接到libAlibBmyProject,它工作正常。该CMakeList.txt s的设置如下:

# 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是相似的。

现在,这里的问题:libBlibA的依赖,以及包括libA的头通过#include <libA/foo.h>,并在链接将需要libA符号(虽然我想这是一个非问题与静态库)。

如何正确设置此依赖关系,以便libB找到所需的关于此本地的所有信息libA,理想情况下只需修改myProject的配置?

回答

2

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

target_link_library(libB PRIVATE libA) 

或者,如果libB使用的libA部分自己的公共API中,使上面的链接依赖PUBLIC而不是PRIVATE。通过这样做,在任何有针对性链接的地方,CMake都会确保libA在最后的命令行上出现。在您的示例中,顶级CMakeLists.txt文件在libA之后链接libB,因此如果没有上述target_link_library()关系,则链接器会抱怨libA丢失的符号,即使libA本来位于链接器命令行上,只是出错了订购。您的顶级CMakeLists.txt文件中的target_link_libraries()的语法也不正确(大概只是您示例中的拼写错误)。参数不应以逗号分隔。

的显式地链接到libBlibA另一个效果是,从现在libAlibB拾取PUBLIC和界面性质,在这种情况下将是报头搜索路径libA定义。您应该会发现libB现在也会找到libA的标题。

+0

感谢您的详细解释,这个作品奇观:) – Quentin