仅将导入模块的 headers 添加到 CMake 中的库
Add only headers of an imported module to a library in CMake
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
.
的构建过程中添加适当的编译器选项并在所需库中包含目录
现在我们必须构建一个库而不是可执行文件,我们不想 link 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?
将我的评论变成答案
add_library(STATIC)
不会 link target_link_libraries()
依赖关系到自身。
简而言之,如果两个静态库将包括例如Boost::filesystem
然后你 link 将这两个库都放入一个可执行文件中(外部符号实际上得到解析)你会得到重复的符号错误。
所以 CMake 默认情况下不会添加 linker 选项,例如 --whole-archive
用于 gcc
或 LinkLibraryDependencies
用于 VC
。
target_link_libraries(foo Boost::filesystem)
应该可以,它只是描述了稍后在构建可执行文件或共享库时解决的依赖关系。
参考资料
- ld linker question: the --whole-archive option
- CMake issue #9732: Cmake does not disable Link Libray Dependencies in the project settings
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
.
现在我们必须构建一个库而不是可执行文件,我们不想 link 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?
将我的评论变成答案
add_library(STATIC)
不会 link target_link_libraries()
依赖关系到自身。
简而言之,如果两个静态库将包括例如Boost::filesystem
然后你 link 将这两个库都放入一个可执行文件中(外部符号实际上得到解析)你会得到重复的符号错误。
所以 CMake 默认情况下不会添加 linker 选项,例如 --whole-archive
用于 gcc
或 LinkLibraryDependencies
用于 VC
。
target_link_libraries(foo Boost::filesystem)
应该可以,它只是描述了稍后在构建可执行文件或共享库时解决的依赖关系。
参考资料
- ld linker question: the --whole-archive option
- CMake issue #9732: Cmake does not disable Link Libray Dependencies in the project settings