CMake 链接仅在调试和发布中发布目标的配置

标签 cmake

是否有另一种方法可以在发布和调试配置中使用 target_link_libraries 包含目标时仅链接目标的发布库。

我知道 target_link_libraries 有选项 optimizedebug 并且它可以像这样完成

target_link_libraries(current_target
    optimized $<TARGET_PROPERTY:lib_target,IMPORTED_IMPLIB_RELEASE>
    debug $<TARGET_PROPERTY:lib_target,IMPORTED_IMPLIB_RELEASE> 
)

但是我通常将目标保存在列表中

set(target_list
    lib_target1
    lib_target2
    ...
)

我在同一个列表上执行其他操作,例如获取目标的二进制目录以包含在搜索路径中以进行调试。使用 optimizeddebug 选项也不允许 lib_target... 属性通过 current_target 传递。我可以解决它,只是好奇是否有其他方法?

最佳答案

如果您与 IMPORTED 目标链接,则其配置相关属性指的是“导入的配置”。您可以随时调整项目配置和导入配置之间的映射:

  1. Global配置映射由CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>调整变量

    下面的设置将使用每个 IMPORTED 目标的Release 配置任何 ReleaseDebug 或 < em>RelWithDebugInfo 项目配置:

     set(CMAKE_MAP_IMPORTED_CONFIG_RELEASE Release)
     set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
     set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBUGINFO Release)
    

请注意,这些设置应该在创建导入目标之前发出。也就是说,如果此类目标是使用 find_package() 调用创建的,则设置应先于这些调用。

  1. Per-target 配置映射由 MAP_IMPORTED_CONFIG_<CONFIG> 调整属性

    下面的设置与上面的全局设置相同,但仅适用于 lib_target1 IMPORTED 目标:

     set_target_properties(lib_target1 PROPERTIES
         MAP_IMPORTED_CONFIG_RELEASE Release
         MAP_IMPORTED_CONFIG_DEBUG Release
         MAP_IMPORTED_CONFIG_RELWITHDEBUGINFO Release)
    

    只有在创建给定的 IMPORTED 目标后才能应用这些设置,例如在 find_package() 调用之后。

值得一提的是,您还可以指定后备导入配置:

set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release Debug)

有了这样的设置,如果你的项目是在Debug配置中构建的,而一些IMPORTED目标没有Release配置,那么它的Debug> 将使用配置。 (但如果该目标既没有 Release 也没有 Debug 配置,CMake 将发出错误)。

关于CMake 链接仅在调试和发布中发布目标的配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57223210/

相关文章:

c++ - cmake 无法检测到 boost 多重安装

c++ - 如何使用 Cmake 构建可执行文件,其中所有依赖项都包含在项目 DIR 中?

cmake - 验证库在 CMake 脚本中的 target_link_libraries 之前可用

c++ - 尝试在 cmake 项目中包含 boost 后出现链接错误

c++ - 正确的 CMakeLists 文件

CMake,在 32 位机器上构建 64 位

linux - 在 debian9 上从源 Rstudio Desktop 安装,错误 cmake

c++ - 将 `-std=c++11` 传递给 CMakeLists?

c++ - CMake:生成或提取共享库所需的 header

android - 如何修复 "Could not find toolchain file" "CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage"cmake libjpeg-turbo.so?