【问题标题】:CMake: How to prevent 'target_link_libraries' from adding visual studio project reference to a static library?CMake:如何防止“target_link_libraries”将 Visual Studio 项目引用添加到静态库?
【发布时间】:2021-12-12 14:48:57
【问题描述】:

我刚刚开始参与我的第一个 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_libraries 移动到target_include_directories,则会出现编译错误(缺少包含),因为target_link_libraries 似乎是递归操作的,这意味着它也添加了链接库的包含目录。

【问题讨论】:

    标签: cmake linker include include-path


    【解决方案1】:

    这似乎是一个已知的issue

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

    我可以清楚的看到大部分依赖都被移除了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      相关资源
      最近更新 更多