【问题标题】:CMake link to only release config of target in both debug and releaseCMake链接仅在调试和发布中发布目标配置
【发布时间】:2020-07-22 15:24:19
【问题描述】:

当包含带有target_link_libraries 的目标以用于发布和调试配置时,是否有另一种方法仅链接目标的发布库。

我知道target_link_librariesoptimizedebug 选项,并且可以这样做

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 选项也不允许通过current_target 传递lib_target... 属性。我可以解决它只是好奇是否有其他方法?

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

    1. 全局配置映射由CMAKE_MAP_IMPORTED_CONFIG_<CONFIG>变量调整。

      下面的设置将使用每个 IMPORTED 目标的 Release 配置,用于 ReleaseDebugany em>RelWithDebugInfo 项目的配置:

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

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

    1. 每个目标配置映射由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() 通话之后。

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

    set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release Debug)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-14
      • 2012-01-10
      • 1970-01-01
      • 2023-03-12
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多