【发布时间】:2021-12-16 08:50:27
【问题描述】:
我有一个包含 2 个静态库和一个可执行文件的小项目。
-
utils:静态库。 -
lib1:一个静态库。lib1中的一些函数使用了utils代码,但大多数没有。 -
main:使用来自lib1的函数的可执行文件,不使用来自utils的代码。
在一个简单的 Visual Studio 项目中,main 只会链接lib1。但由于 lib1 需要一些 utils 的 target_include_directories 来编译,lib1 的 cmake 代码包含一个 target_link_libraries 调用:
utils 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 链接不必要的静态库?
【问题讨论】:
-
名为
utils或misc的库通常会成为太多好东西 的垃圾场。我建议将utils拆分为更小的部分 - 并适当地命名生成的库。这样一来,不只是继续向它们添加功能会更容易。 -
@TedLyngmo 这只是一个虚拟案例。这种使用模式在我开始从事的一个大型项目中经常出现。试图看看如何解决这个问题。
-
是的,我也见过很多。 “解决方案”通常是拆分臃肿的库。你可以轻松开始。将其拆分为 2 部分,以便库中仅保留
lib1使用的函数。如果这不能更容易地为剩余的函数提供一个好的库名称,请再次拆分。