我正在尝试使用 .proto 文件将 C++ 代码编译成单个二进制文件。我目前的流程有两个步骤;
- 使用 protoc 从 3 个 .proto 文件生成 C++ 代码。
- 将生成的代码和我自己的 C++ 代码编译成一个 .o 文件。
但是,当我尝试在步骤 2 中编译时,生成的代码指定输出为“com/company/B.pb.h”,编译器无法找到该文件,因为该文件位于同一目录中。
我不想手动更改生成的代码导入,因为我觉得应该由 protoc 完成,并且我们还将这些 proto 文件用于其他项目(包括使用相同的 .proto 文件生成 java 代码,这是可行的)。有没有办法在不更改原型导入的情况下指定生成代码的导入?
编辑:一次生成多个文件时,这是 protoc 的问题吗?我应该使用不同的命令吗?
我知道 java 有一些选项,比如指定包或类名,但我找不到 C++ 类似的东西。
option java_multiple_files = true;
option java_package = "com.company.B";
option java_outer_classname = "B";
任何帮助深表感谢。更多详情如下。
目录结构:
.
├── com
│ └── company # generated code
│ ├── A.pb.cc
│ ├── A.pb.h
│ ├── B.pb.cc
│ ├── B.pb.h
│ ├── C.pb.cc
│ └── C.pb.h
├── Parser.cc
├── Parser.h
└── proto
└── com
└── company
├── A.proto
├── B.proto
└── C.proto
协议命令:(从 . 运行)
protoc --cpp_out=. --proto_path=proto/ com/company/A.proto com/company/B.proto com/company/C.proto
A.proto 片段:
syntax = "proto3";
option optimize_for = SPEED;
package com.company;
import "com/company/B.proto"; # specified as full path re Google's documentation
...
解析器.cc:
#include "parser.h"
...
解析器.h:
#include "com/company/A.pb.h"
#include "com/company/B.pb.h"
#include "com/company/C.pb.h"
...
G++ 命令:
g++ -fPIC -Lprotoc -lprotobuf parser.cc -o parser.so
错误:
fatal error: com/company/B.pb.h: No such file or directory
#include "com/company/B.pb.h"
^~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.