You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置为例:
    add_executable(Server
      # 原有Server的其他源文件,例如:
      src/main.cpp
      src/server_impl.cpp
      # 新增生成的代码文件到源列表
      ${CODEGEN_SRC}
    )
    # 保留原有依赖配置,确保构建顺序正确
    ADD_DEPENDENCIES(Server ${CODEGEN_TARGET})
    
    Client侧的CMakeLists.txt做相同修改即可。

注意:

  1. 请确认${CODEGEN_SRC}变量中定义的文件路径,和CODEGEN_CMD命令实际输出的文件路径完全一致,否则CMake无法关联生成规则,仍然会报错。
  2. 你示例代码中的--generate-cpp- code参数中间多了一个空格,实际使用时请修正为--generate-cpp-code,避免命令执行失败。

内容的提问来源于stack exchange,提问作者JungWoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:36:05