CMake使用add_custom_command生成gdbus代码首次构建找不到源文件如何解决
CMake 首次构建找不到gdbus-codegen生成代码的解决方案
报错的核心原因是:CMake 在配置阶段(执行cmake ..时)会默认检查add_executable中列出的所有源文件是否存在,而你生成的代码文件是在构建阶段(执行make时)才生成的。add_dependencies仅能控制构建阶段的目标执行顺序,无法解决配置阶段的文件存在性检查报错。
修复步骤
- 第一步:给生成的源文件标记
GENERATED属性,告诉CMake该文件是构建阶段生成的,配置阶段不需要检查存在性
在你定义自定义构建规则的CMakeLists.txt中添加代码,修改后完整片段如下:add_custom_command( OUTPUT ${CODEGEN_SRC} # 移除无效的PRE_BUILD参数,该参数仅支持Visual Studio生成器 COMMAND ${CODEGEN_CMD} ${SERVICE_XML} --generate-cpp-code=/home/hello/include/gen/testGenCode COMMENT "Generate gdbus code" ) add_custom_target(${CODEGEN_TARGET} DEPENDS ${CODEGEN_SRC} ) # 新增行:标记生成文件属性 set_source_files_properties(${CODEGEN_SRC} PROPERTIES GENERATED TRUE) - 第二步:将生成的源文件直接加入到Server、Client的可执行目标的源文件列表中,不要仅单独设置依赖
以Server侧的CMakeLists.txt配置为例:
Client侧的CMakeLists.txt做相同修改即可。add_executable(Server # 原有Server的其他源文件,例如: src/main.cpp src/server_impl.cpp # 新增生成的代码文件到源列表 ${CODEGEN_SRC} ) # 保留原有依赖配置,确保构建顺序正确 ADD_DEPENDENCIES(Server ${CODEGEN_TARGET})
注意:
- 请确认
${CODEGEN_SRC}变量中定义的文件路径,和CODEGEN_CMD命令实际输出的文件路径完全一致,否则CMake无法关联生成规则,仍然会报错。- 你示例代码中的
--generate-cpp- code参数中间多了一个空格,实际使用时请修正为--generate-cpp-code,避免命令执行失败。
内容的提问来源于stack exchange,提问作者JungWoo
相关产品推荐
相关产品推荐

