编译后的protobuf文件的意外输出路径

时间:2019-06-12 14:14:44

标签: c++ cmake protocol-buffers protoc

我正在尝试使用CMake编译.proto文件的几个子文件夹,我希望输出结果以类似的文件夹结构结尾。我对CMake还是很陌生,所以我希望这是一种优雅的方法,但是现在我正在手动指定子文件夹,以便了解发生了什么。在这一点上,运行下面显示的CMakeLists.txt成功读取了.proto文件并生成了源代码,但是并没有像我期望的那样都以./proto_gen/include/frontseat/vehicle结尾。 proto_gen / include / frontseat / vehicle / vehicle。

我已经尝试打印出对execute_process的调用中的所有路径,并且它们中的任何一个都没有这个双重嵌套的“车辆/车辆”,所以我假设这与protoc命令的方式有关生成文件名。但是,令我感到奇怪的是,以前我将所有原始文件都放在一个文件夹中,并且文件名从何而来似乎一目了然。此版本与该版本之间的唯一区别是我在路径中添加了“ vehicle”文件夹。

# Define CMake requirements and project name
cmake_minimum_required(VERSION 3.0)
project( frontseat )

# Define directories for .proto files and compiled output
GET_FILENAME_COMPONENT(PROTO_MAIN_DIR "./proto" ABSOLUTE)
GET_FILENAME_COMPONENT(PROTO_GEN_DIR "./proto_gen" ABSOLUTE)

# Get all the .proto files to be compiled from the first subfolder
file(GLOB PROTO_FILES ${PROTO_MAIN_DIR}/${PROJECT_NAME}/vehicle/*.proto)

# Make directories needed for protobuf files
file(MAKE_DIRECTORY ${PROTO_GEN_DIR}/include/${PROJECT_NAME}/vehicle)
file(MAKE_DIRECTORY ${PROTO_GEN_DIR}/src/vehicle)

# Iterate over the list of .proto files to compile
FOREACH (proto ${PROTO_FILES})
  get_filename_component(basename ${proto} NAME_WE)

  # Generate proto file using protoc executable
  message("   Processing vehicle proto file: " ${basename})
  execute_process(COMMAND protoc --cpp_out=${PROTO_GEN_DIR}/include/${PROJECT_NAME}/vehicle -I${PROTO_MAIN_DIR}/${PROJECT_NAME} ${PROTO_MAIN_DIR}/${PROJECT_NAME}/vehicle/${basename}.proto)
ENDFOREACH(proto)

谁能告诉我“车辆”子文件夹的额外层从哪里来以及如何删除它?

1 个答案:

答案 0 :(得分:0)

这可能与您的问题有关: https://github.com/protocolbuffers/protobuf/issues/3044

基本上,您提供的第一个导入路径将用作原始文件结构的根,并使用此相对结构在输出目录中生成输出。因此,您只需要将命令更改为COMMAND protoc --cpp_out=${PROTO_GEN_DIR}/include/${PROJECT_NAME} -I${PROTO_MAIN_DIR}/${PROJECT_NAME} ${PROTO_MAIN_DIR}/${PROJECT_NAME}/vehicle/${basename}.proto