仅将导入模块的标头添加到CMake中的库

时间:2018-05-24 15:14:03

标签: cmake cmake-modules

在CMake中有导入的模块,用于简单地将外部模块添加到本地目标。例如,如果我们想在项目中使用boost::filesystem库,我们可以像CMakeLists.txt一样:

project(foo CXX)

find_packge(Boost REQUIRED COMPONENTS filesystem)

add_executable(foo main.cpp)
target_link_libraries(foo Boost::filesystem)

通过上述配置,CMake将添加适当的编译器选项,并在所需库中包含目录,以构建foo的过程。

现在我们必须构建一个库而不是可执行文件,我们不想将boost::filesystem库链接到我们的库。我们只需要编译器选项并包含要添加到目标的目录。我们可以使用导入的模块概念吗?我的意思是,如果我们可以使用Boost::filesystem语法将这些选项添加到目标中吗?

project(foo CXX)

find_packge(Boost REQUIRED COMPONENTS filesystem)

add_library(foo STATIC foo.cpp)
# what should be wrote here to only add headers and configs to foo not the libs?

1 个答案:

答案 0 :(得分:1)

将我的评论转化为答案

add_library(STATIC)不会将target_link_libraries()依赖关系链接到自身。

简而言之,如果两个静态库包括例如Boost::filesystem然后将这两个库链接到一个可执行文件(外部符号实际得到解决),你会得到重复的符号错误。

默认情况下,CMake不会为--whole-archive添加gccLinkLibraryDependencies VC等链接器选项。

target_link_libraries(foo Boost::filesystem)应该可以工作,它只是描述了在构建可执行文件或共享库之后解决的依赖关系。

<强>参考