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

Kra*_*zer 4 cmake

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

我知道target_link_libraries有选择optimize并且debug可以这样做

target_link_libraries(current_target
    optimized $<TARGET_PROPERTY:lib_target,IMPORTED_IMPLIB_RELEASE>
    debug $<TARGET_PROPERTY:lib_target,IMPORTED_IMPLIB_RELEASE> 
)
Run Code Online (Sandbox Code Playgroud)

不过,我通常将目标保留在列表中

set(target_list
    lib_target1
    lib_target2
    ...
)
Run Code Online (Sandbox Code Playgroud)

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

Tsy*_*rev 5

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

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

    下面的设置将使用项目的任何ReleaseDebugRelWithDebugInfo配置的每个IMPORTED 目标的Release配置:

     set(CMAKE_MAP_IMPORTED_CONFIG_RELEASE Release)
     set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release)
     set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBUGINFO Release)
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 每个目标的配置映射通过MAP_IMPORTED_CONFIG_<CONFIG> 属性进行调整。

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

     set_target_properties(lib_target1 PROPERTIES
         MAP_IMPORTED_CONFIG_RELEASE Release
         MAP_IMPORTED_CONFIG_DEBUG Release
         MAP_IMPORTED_CONFIG_RELWITHDEBUGINFO Release)
    
    Run Code Online (Sandbox Code Playgroud)

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

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

set(CMAKE_MAP_IMPORTED_CONFIG_DEBUG Release Debug)
Run Code Online (Sandbox Code Playgroud)

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