cmake - 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_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)
我可以清楚地看到大部分依赖项都被删除了。
推荐阅读
- django - 如何使用 Django Rest Framework 使用电子邮件和密码通过 REST 对用户进行身份验证
- python - 无法关闭侦听套接字以从单独的线程中止接受()/选择()
- r - 哪个统计测试度量组之间的相关性
- azure - 部署调用错误的 SSDT 表格模型目标
- php - 首次运行后在 PHP 中注释代码行?
- java - 杰克逊不序列化字段
- vue.js - 全局实例属性更改时 Vue 不更新
- list - 如何让我的函数一次通过两个列表?
- java - payara-micro lib驱动jar文件真的有必要吗?
- bash - 如果使用 FFmeg 横向,则有条件地旋转纵向视频