已编译的 protobuf 文件的意外输出路径
Unexpected output path for compiled protobuf files
我正在尝试使用 CMake 编译 .proto 文件的几个子文件夹,我希望输出以类似的文件夹结构结束。我是 CMake 的新手,所以我希望这是一种优雅的方式,但现在我正在手动指定子文件夹,以便我可以看到发生了什么。在这一点上,运行 我在下面显示的 CMakeLists.txt 成功读取了 .proto 文件并生成了源代码,但并没有像我预期的那样以 ./proto_gen/include/frontseat/vehicle 结束,它们都结束了在./proto_gen/include/frontseat/vehicle/车辆.
我已经尝试打印出对 execute_process 的调用中的所有路径,其中 none 在任何地方都有这种双重嵌套 "vehicle/vehicle",所以我假设这与 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)
谁能告诉我 "vehicle" 子文件夹的额外层从哪里来以及如何删除它?
这可能与您的问题有关:
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
我正在尝试使用 CMake 编译 .proto 文件的几个子文件夹,我希望输出以类似的文件夹结构结束。我是 CMake 的新手,所以我希望这是一种优雅的方式,但现在我正在手动指定子文件夹,以便我可以看到发生了什么。在这一点上,运行 我在下面显示的 CMakeLists.txt 成功读取了 .proto 文件并生成了源代码,但并没有像我预期的那样以 ./proto_gen/include/frontseat/vehicle 结束,它们都结束了在./proto_gen/include/frontseat/vehicle/车辆.
我已经尝试打印出对 execute_process 的调用中的所有路径,其中 none 在任何地方都有这种双重嵌套 "vehicle/vehicle",所以我假设这与 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)
谁能告诉我 "vehicle" 子文件夹的额外层从哪里来以及如何删除它?
这可能与您的问题有关: 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