如何根据当前编译配置获取IMPORTED_LOCATION属性值?
解决CMake获取导入目标对应配置IMPORTED_LOCATION的问题
直接调用get_target_property查询IMPORTED_LOCATION会失败,因为这个属性是配置相关的——你为不同编译配置(Debug/Release等)设置了IMPORTED_LOCATION_<CONFIG>,但未定义通用的IMPORTED_LOCATION属性,CMake无法自动推断要取哪个配置的值。
下面是两种可行的解决方案:
方案1:使用生成器表达式(推荐,适配所有生成器)
生成器表达式会在构建阶段根据当前选择的编译配置,自动解析对应路径,是最可靠的方式。比如要将engine.dll复制到目标输出目录,可以用add_custom_command实现:
# 假设你的主目标是your_exe(替换成你实际的目标名) add_custom_command( TARGET your_exe POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_PROPERTY:engine,IMPORTED_LOCATION> $<TARGET_FILE_DIR:your_exe> )
$<TARGET_PROPERTY:engine,IMPORTED_LOCATION>会自动匹配当前构建配置对应的IMPORTED_LOCATION_<CONFIG>值,无需手动判断配置。
方案2:脚本阶段手动拼接配置属性名(仅适用于单配置生成器)
如果需要在CMake脚本执行阶段(而非构建阶段)获取路径,可先获取当前编译配置,再拼接对应的属性名:
# 获取当前配置(单配置生成器如Makefile/Ninja可用CMAKE_BUILD_TYPE) set(current_config ${CMAKE_BUILD_TYPE}) # 转为大写,匹配属性名的格式(IMPORTED_LOCATION_DEBUG/RELEASE等) string(TOUPPER ${current_config} current_config_upper) get_target_property( dynamic_library_target_imported_location engine IMPORTED_LOCATION_${current_config_upper} )
注意:这种方法仅适用于单配置生成器,多配置生成器(如Visual Studio)在脚本阶段无法确定最终使用的配置,因此不适用。
内容的提问来源于stack exchange,提问作者Elad Maimoni
相关产品推荐
相关产品推荐

