如何通过CMake将Protobuf文件转为C++并使输出文件与原文件同目录?
解决CMake生成Protobuf C++文件到指定目录的问题
你的问题出在set_target_properties的RUNTIME_OUTPUT_DIRECTORY属性仅对可执行目标生效,自定义目标不支持该属性。要将Protobuf生成的C++文件放到与.proto文件相同的目录,有两种可行方案:
方案一:使用CMake 3.15+原生参数(推荐)
CMake 3.15及以上版本的protobuf_generate_cpp支持OUTPUT_DIR参数,可直接指定输出目录:
find_package(Protobuf REQUIRED) file(GLOB PROTO_FILES *.proto) # 指定输出目录为当前源文件目录 protobuf_generate_cpp(CPP_SOURCE_FILES PROTO_HEADERS ${PROTO_FILES} OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) add_custom_target(PROTO_TO_CPP ALL DEPENDS ${CPP_SOURCE_FILES})
方案二:手动调用protoc命令(兼容旧版本CMake)
若你的CMake版本低于3.15,可通过自定义命令直接调用protoc工具,完全控制输出路径:
find_package(Protobuf REQUIRED) file(GLOB PROTO_FILES *.proto) # 定义生成文件的输出目录(与proto文件同目录) set(GENERATED_DIR ${CMAKE_CURRENT_SOURCE_DIR}) foreach(PROTO_FILE ${PROTO_FILES}) # 获取proto文件名(不含后缀) get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE) # 定义生成的cpp和h文件路径 set(GENERATED_CPP ${GENERATED_DIR}/${PROTO_NAME}.pb.cc) set(GENERATED_H ${GENERATED_DIR}/${PROTO_NAME}.pb.h) # 添加自定义生成命令 add_custom_command( OUTPUT ${GENERATED_CPP} ${GENERATED_H} COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ARGS --cpp_out=${GENERATED_DIR} -I${CMAKE_CURRENT_SOURCE_DIR} ${PROTO_FILE} DEPENDS ${PROTO_FILE} COMMENT "Generating C++ files from ${PROTO_FILE}" ) # 将生成文件添加到列表中 list(APPEND CPP_SOURCE_FILES ${GENERATED_CPP}) list(APPEND PROTO_HEADERS ${GENERATED_H}) endforeach() add_custom_target(PROTO_TO_CPP ALL DEPENDS ${CPP_SOURCE_FILES} ${PROTO_HEADERS})
注意事项
直接将生成文件放到源码目录会污染源码树,建议在源码目录下创建子文件夹(比如generated)存放生成文件,避免版本管理工具(如Git)误提交自动生成的文件。
内容的提问来源于stack exchange,提问作者Epsilon
相关产品推荐
相关产品推荐

