c++ - 如何避免将不必要的静态库与 CMake 链接?
问题描述
我有一个带有 2 个静态库和一个可执行文件的小项目。
utils
: 静态库。lib1
: 静态库。中的一些函数lib1
使用utils
代码,但大多数不使用。main
: 一个使用来自 的函数的可执行文件,lib1
不使用来自 的代码utils
。
在一个简单的 Visual Studio 项目中,main
只会链接lib1
. 但是由于 lib1 需要一些 utilstarget_include_directories
来编译,所以 cmake 代码lib1
包含一个target_link_libraries
调用:
实用程序 CMakeLists.txt:
target_include_directories(utils INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) # lib1 needs this
lib1:CMakeLists.txt:
target_link_libraries(lib1 PRIVATE utils) # some of lib1 code uses utils
主要:CMakeLists.txt:
target_link_libraries(main PRIVATE lib1) # this causes utils to link as well
问题是在生成的项目中,main
包含 2 个依赖项而不是 1 个。如果我手动utils
从依赖项列表中删除,一切正常。
但是现在我必须编译 utils 才能编译 main。
main
仅与 链接的正确方法是什么lib1
?更一般地说,如何避免将不必要的静态库与 cmake 链接?
解决方案
主要问题是静态库只不过是目标文件的档案。链接静态库就像链接目标文件本身一样。
这导致两件事:
- 静态库本身不链接;
- 并且您需要链接静态库的所有依赖项。
对于您的项目,该main
程序必须与这两个静态库链接。
推荐阅读
- python - Python Pandas:有效地聚合不同列上的不同函数并将结果列组合在一起
- python - 评估数字总和的调试功能
- c# - 启用 MSI 时连接到 SQL
- django-models - 虽然从日期开始到日期,日期之间的所有文件都应该在 django 中列出
- compilation - 跳转标签分析和生成是什么编译器技术?
- java - 为什么我不能使用我的代码从 excel 中获取值到列表中?
- python - 两个 3d 点之间的 Mayavi 弯曲箭头
- python - 如何确保正确配置 anaconda 环境以导入包
- javascript - 安装电子与安装电子生成器
- vue.js - 如何从 element-ui 中删除工具提示组件中的淡出过渡?