使用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命令直接拆分输出目录,只能通过「统一生成到中间目录+后置分发」的方式实现拆分,示例配置如下:
- 先将所有生成文件输出到临时中间目录
protobuf_generate( TARGET my_target LANGUAGE cpp PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf_tmp PROTOS ${PROTO_SOURCES} )
- 添加自定义后置命令,将两类文件分别移动到目标目录
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
相关产品推荐
相关产品推荐

