首页 > 解决方案 > 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在生成的 vcxproj 文件中以 Visual Studio ProjectReference条目的形式添加其他包含目录项目依赖项。因此,'this_lib' 不会与其他库同时编译,这大大增加了编译时间。

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

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

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

标签: cmakelinkerincludeinclude-path

解决方案


这似乎是一个已知问题

此问题的快速解决方法是使用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)

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


推荐阅读