CMake中add_custom_target未生成目标及组件安装无文件输出问题
问题分析与解决方案
一、为什么make my-configs找不到目标?
你定义的add_custom_target(my-configs)是一个空目标——它没有关联任何命令、依赖文件或输出。CMake 只会为有实际动作或依赖的自定义目标生成 Makefile 规则,空目标不会被生成,所以make找不到对应的规则。
另外,你在install()中使用了EXCLUDE_FROM_ALL,这个选项会让该安装规则脱离默认的构建流程,但它和自定义目标之间没有任何关联,所以自定义目标依然是空的,无法触发任何操作。
二、直接执行cmake install指定组件却没有安装文件?
这里有两个关键错误:
- 组件名不匹配:你的
install()指令中指定的组件是my-configs(短横线),但执行安装命令时写的是-DCOMPONENT=my_configs(下划线)。CMake 对组件名的大小写和符号是严格匹配的,这会导致它找不到对应的组件规则。 - (可选)
EXCLUDE_FROM_ALL的影响:这个选项会让该安装规则不被默认的make install包含,但只要显式指定正确的组件名,依然可以触发安装——所以核心问题还是组件名不匹配。
三、修复方案
方案1:让自定义目标触发组件安装
如果你希望通过make my-configs来安装配置文件,可以修改自定义目标,让它直接调用 CMake 的安装命令:
add_custom_target(my-configs COMMAND ${CMAKE_COMMAND} -DCOMPONENT=my-configs -P ${CMAKE_BINARY_DIR}/cmake_install.cmake WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Installing configuration files (my-configs component)" )
这样执行make my-configs时,就会自动运行指定组件的安装流程,把file1.cfg复制到目标目录。
方案2:直接修复安装命令(无需自定义目标)
如果你不需要自定义目标,只需要修正安装命令中的组件名即可:
cd ../cmake-build/linux_64_static_make_RelWithDebInfo && DESTDIR=../../cmake-install/linux_64_static_make_RelWithDebInfo cmake -DCOMPONENT=my-configs -P cmake_install.cmake
把my_configs改成my-configs,CMake 就能正确识别组件并安装file1.cfg了。
额外说明:关于EXCLUDE_FROM_ALL
这个选项的作用是让该安装规则不被默认的make install执行,只有当显式指定该组件时才会安装——这完全符合你“仅负责复制文件的独立组件”的需求,所以可以保留这个选项。
内容的提问来源于stack exchange,提问作者ghostrider
相关产品推荐
相关产品推荐

