CMake无法导出Debug配置:问题排查与解决方案
如何同时导出CMake的Debug和Release配置目标?
问题描述
我需要导出项目中的多个目标,原本用install命令完成导出操作。现在要给开发调试的客户端同时提供Debug和Release两种配置的目标,但始终生成不了my_export-debug.cmake文件。
我执行的核心代码如下:
install(TARGETS ${my_targets} EXPORT my_export CONFIGURATIONS Debug;Release Runtime DESTINATION ${CMAKE_INSTALL_LIBDIR} CONFIGURATIONS Debug;Release ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} CONFIGURATIONS Debug;Release) install(EXPORT my_export DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake CONFIGURATIONS Debug;Release)
安装完成后只生成了my_export.cmake和my_export-release.cmake,Debug版本无法正常工作——因为缺少Debug导入目标,只有Release版本的。
查看my_export.cmake文件,里面有这段代码:
file(GLOB _cmake_config_files "${CMAKE_CURRENT_LIST_DIR}/my_export-*.cmake") foreach(_cmake_config_file IN LISTS _cmake_config_files) include("${_cmake_config_file}") endforeach()
显然只要存在my_export-debug.cmake就能加载Debug导出目标,但就是生成不了这个文件。
解决方案
问题出在两个地方,对应解决办法如下:
- 多配置生成器需指定安装配置:使用Visual Studio这类多配置生成器时,执行
cmake --install必须传入--config参数,需要分别针对Debug和Release配置各执行一次安装命令:cmake --install . --config Debug cmake --install . --config Release - 按配置区分目标安装路径:原命令将Debug和Release目标安装到同一路径,导致覆盖。需要用生成器表达式按配置区分路径,推荐用
$<LOWER_CASE:$<CONFIG>>生成小写的路径名,修改后的install命令如下:install(TARGETS ${my_targets} EXPORT my_export CONFIGURATIONS Debug;Release Runtime DESTINATION ${CMAKE_INSTALL_LIBDIR}/$<LOWER_CASE:$<CONFIG>> CONFIGURATIONS Debug;Release ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/$<LOWER_CASE:$<CONFIG>> CONFIGURATIONS Debug;Release)
内容的提问来源于stack exchange,提问作者FoundationFather
相关产品推荐
相关产品推荐

