我正在开发一个项目,该项目由一个与两个库链接的可执行文件组成
我经常对所有人进行调查,并且不想为libA
和libB
进行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子目录自动将libB
和myProject
链接到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}}的配置?
答案 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()
的语法也不正确(可能只是您示例中的拼写错误)。参数不应以逗号分隔。
明确地将libB
与libA
关联起来的另一个影响是现在libB
从libA
获取PUBLIC和INTERFACE属性,在这种情况下将是标题搜索libA
定义的路径。您应该会发现libB
现在也会找到libA
的标题。