0

在 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?
4

1 回答 1

1

将我的评论变成答案

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

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

因此默认情况下,CMake 不会添加链接器选项,例如--whole-archiveforgccLinkLibraryDependenciesfor VC

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

参考

于 2018-05-28T10:24:49.763 回答