c++ - 编译的 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)
谁能告诉我“车辆”子文件夹的额外层来自这里以及如何删除它?
解决方案
这可能与您的问题有关: 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
推荐阅读
- django - Celery & Celery Beat 守护进程没有运行任务
- java - Maven 构建不使用 grpc-java 生成代码
- macos - 部署在另一台机器上时正在修改 Macho 运行路径
- pytorch - Pytorch 嵌入层中的 BERT 嵌入
- influxdb - 手动按特定顺序排序
- matlab - 使用 histfit 拟合正态分布时指定 bin 边缘
- python - 空行对训练 FastText 模型的影响
- angular - NgRx 数组状态如何修复类型约定?
- artifactory - JFrog Xray 可以只扫描 Maven 工件吗?
- python - Pygame - 接地时平台跳跃无响应