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



我正在尝试使用 CMake 编译 .proto 文件的几个子文件夹,我希望输出最终出现在类似的文件夹结构中。我对 CMake 很陌生,所以我希望这是一种优雅的方法,但现在我正在手动指定子文件夹,以便我可以看到发生了什么。在这一点上,运行CMakeLists.txt我在下面显示成功读取了.proto文件并生成了源代码,但不是像我预期的那样

以./proto_gen/include/前座/车辆结束,它们最终都以./proto_gen/include/前座/车辆/车辆结束。我尝试打印出调用execute_process中的所有路径,但它们都没有在任何地方都有这种双重嵌套的"车辆/车辆",所以我假设这与 protoc 命令如何生成文件名有关。不过,对我来说奇怪的是,以前我将所有原型文件都放在一个文件夹中,并且所有内容似乎都很清楚文件名的来源。此版本之间的唯一区别是我将"车辆"文件夹添加到路径的位置。

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

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

这可能与您的问题有关: 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

最新更新