CMake:如何防止'target_link_libraries'将Visual Studio项目引用添加到静态库中?



我刚刚开始参与我的第一个cmake项目。包含多个静态库的项目和一个单一的可执行文件链接它们。

目前,一个典型的静态库'this_lib'的CMakeLists.txt有这样的形式:

target_include_directories(
this_lib
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
${Boost_INCLUDE_DIRS}
)
target_link_libraries (this_lib PUBLIC
lib1
lib2
lib3
lib4
lib5
${Boost_LIBRARIES}
)

target_link_libraries添加了额外的包含目录项目依赖关系,以visual studio的形式显示生成的vcxproj文件中的条目。因此,'this_lib'不会与其他库并发编译,这大大增加了编译时间。

那么是否有一种方法来配置target_link_libraries,使其不会在Visual Studio中添加项目参考?

这是我到目前为止所尝试的:

如果我将参数从target_link_libraries移动到target_include_directories,我得到编译错误(缺少包含),因为似乎target_link_libraries递归地操作,这意味着它也添加了链接库的包含目录。

这似乎是一个已知问题。

这个问题的一个快速修复方法是使用3.19版本引入的OPTIMIZE_DEPENDENCIES属性。

当此属性设置为true时,如果构建静态库或对象库不需要某些依赖项,则可以在生成时删除它们,因为静态库和对象库实际上不链接任何东西。

文档不清楚如何实际设置此属性。但我设法让它工作使用set_target_properties:

add_library(this_lib STATIC ...)
set_target_properties(this_lib PROPERTIES OPTIMIZE_DEPENDENCIES ON ...)

或者对于顶层的所有项目CMakeLists.txt

set(CMAKE_OPTIMIZE_DEPENDENCIES 1)

我可以清楚地看到,大部分依赖项都被删除了。

最新更新