CMake:如何防止 'target_link_libraries' 添加对静态库的 visual studio 项目引用?

CMake: How to prevent 'target_link_libraries' from adding visual studio project reference to a static library?

我刚刚开始参与我的第一个cmake项目。该项目有许多 静态库 和一个 link 它们全部的可执行文件。

目前,静态库 '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 ProjectReference 条目的形式添加额外的包含目录 and 项目依赖项生成的 vcxproj 文件。因此,'this_lib' 不会与其他库同时编译,这大大增加了编译时间。

那么有没有办法配置 target_link_libraries 这样它就不会在 Visual Studio 中添加项目引用?

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

如果我将参数从 target_link_libraries 移动到 target_include_directories,我会得到编译错误(缺少包含),因为它似乎 target_link_libraries 递归操作,这意味着它添加了 [= 的包含目录41=]也编辑了图书馆。

这似乎是一个已知的 issue

此问题的快速解决方法是使用版本 3.19 中引入的 OPTIMIZE_DEPENDENCIES 属性。

When this property is set to true, some dependencies for a static or object library may be removed at generation time if they are not necessary to build the library, since static and object libraries don't actually link against anything.

文档不清楚 属性 的实际设置方式。 但我设法使用 set_target_properties:

让它工作
add_library(this_lib STATIC ...)

set_target_properties(this_lib PROPERTIES OPTIMIZE_DEPENDENCIES ON ...)

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

set(CMAKE_OPTIMIZE_DEPENDENCIES 1)

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