CMake链接到调试和发布版本中仅发布目标的配置

时间:2019-07-26 15:40:09

标签: cmake

当发布和调试配置都包含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选项也不允许lib_target ...属性通过current_target传递。我可以解决这个问题,只是想知道是否还有其他方法?

1 个答案:

答案 0 :(得分:0)

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

  1. 全局配置映射通过CMAKE_MAP_IMPORTED_CONFIG_<CONFIG> 变量进行调整。

    以下设置将为每个导入目标的 Release 配置,用于 Release Debug 或<您项目的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()调用创建的,则设置应优先于这些调用。

  2. 每个目标配置映射是通过MAP_IMPORTED_CONFIG_<CONFIG> properties 进行调整的。

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

    set_target_properties(lib_target1 PROPERTIES
        MAP_IMPORTED_CONFIG_RELEASE RELEASE
        MAP_IMPORTED_CONFIG_DEBUG RELEASE
        MAP_IMPORTED_CONFIG_RELWITHDEBUGINFO RELEASE)
    

    只有在创建给定的导入目标后,才能应用这些设置。在find_package()通话之后。

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

set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG RELEASE DEBUG)

使用这种设置,如果您的项目是在 Debug 配置中构建的,并且某些导入的目标没有 Release 配置,则其 Debug 将使用配置。 (但是,如果该目标既没有Release配置又没有Debug配置,则CMake将发出错误)。