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

使用CMake protobuf_generate能否分离生成Protobuf头文件与源文件

CMake下protobuf_generate拆分生成头文件和源文件的方案

原配置失效的原因

官方提供的protobuf_generate命令本身不支持限制protoc仅生成单类文件,你配置的GENERATE_EXTENSIONS参数仅用于告知CMake需要将哪些后缀的生成文件纳入目标编译逻辑,不会修改protoc的生成行为。
protoc的C++代码生成器默认会同时输出.pb.h头文件和.pb.cc源文件,所以你两次调用protobuf_generate相当于执行了两次protoc,每次都会生成两类文件,自然会在两个目标目录都出现完整的生成产物。

可行的实现方案

目前没有办法通过原生protobuf_generate命令直接拆分输出目录,只能通过「统一生成到中间目录+后置分发」的方式实现拆分,示例配置如下:

  1. 先将所有生成文件输出到临时中间目录
protobuf_generate(
  TARGET
    my_target
  LANGUAGE
    cpp
  PROTOC_OUT_DIR
    ${CMAKE_CURRENT_BINARY_DIR}/protobuf_tmp
  PROTOS
    ${PROTO_SOURCES}
)
  1. 添加自定义后置命令,将两类文件分别移动到目标目录
add_custom_command(TARGET my_target POST_BUILD
  # 提前创建目标目录
  COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/gen/include
  COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_SOURCE_DIR}/gen/src
  # 分发不同后缀的文件到对应目录
  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/protobuf_tmp/*.pb.h ${CMAKE_CURRENT_SOURCE_DIR}/gen/include/
  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/protobuf_tmp/*.pb.cc ${CMAKE_CURRENT_SOURCE_DIR}/gen/src/
  # 可选:清理临时中间目录
  COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/protobuf_tmp
  DEPENDS ${PROTO_SOURCES}
)

注意事项

  • 建议优先将生成文件放到构建二进制目录(即CMAKE_CURRENT_BINARY_DIR的子目录)而非源码目录,避免污染源码树、减少版本库冗余文件。
  • 如果有特殊需求需要自定义生成逻辑,也可以直接调用protoc命令手动控制生成流程,而非使用封装好的protobuf_generate。

内容的提问来源于stack exchange,提问作者Dávid Tóth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:54:02