首页 > 解决方案 > 如何避免将不必要的静态库与 CMake 链接?

问题描述

我有一个带有 2 个静态库和一个可执行文件的小项目。

在一个简单的 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 链接?

标签: c++cmake

解决方案


主要问题是静态库只不过是目标文件的档案。链接静态库就像链接目标文件本身一样。

这导致两件事:

  1. 静态库本身不链接;
  2. 并且您需要链接静态库的所有依赖项。

对于您的项目,该main程序必须与这两个静态库链接。


推荐阅读