首页 > 解决方案 > 编译的 protobuf 文件的意外输出路径

问题描述

我正在尝试使用 CMake 编译 .proto 文件的几个子文件夹,并且我希望输出以类似的文件夹结构结束。我对 CMake 很陌生,所以我希望这是一种优雅的方式,但现在我手动指定子文件夹,以便我可以看到发生了什么。此时,运行我在下面显示的 CMakeLists.txt 成功读取 .proto 文件并生成源代码,但不是像我预期的那样以 ./proto_gen/include/frontseat/vehicle 结尾,它们都以 ./ proto_gen/include/frontseat/车辆/车辆。

我已经尝试在对 execute_process 的调用中打印出所有路径,但它们都没有这种双重嵌套的“车辆/车辆”,所以我假设这与 protoc 命令生成文件名的方式有关. 不过,对我来说奇怪的是,以前我将所有的 proto 文件都放在一个文件夹中,而且文件名的来源似乎很清楚。这个版本和那个版本之间的唯一区别是我将“车辆”文件夹添加到路径的地方。

# 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)

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

标签: c++cmakeprotocol-buffersprotoc

解决方案


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

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


推荐阅读