我正在尝试使用.proto文件将C++代码编译成单个二进制文件。我当前的过程有2个步骤;
但是,当我尝试在步骤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命令:(从运行。)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
...
Parser.cc:#include "parser.h"
...
Parser.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.
最佳答案
我从未找到一种为C++生成的代码指定输出的方法,但我找到了一种无需进行复杂的变通方法即可正确编译代码的方法,我认为这是我一开始就应该采用的方法。开始:
第1步,生成的C++代码保持不变,并且使用路径include生成该代码,并在同一目录中进行编译。
第2步成为制作文件(我们使用Ruby Make / Rake,但概念相同)
生成文件指定;
-fPIC -lprotobuf
(请注意此处缺少-Lprotoc
,我在跟踪中进一步遇到错误。通常涉及 undefined symbol )$(srcdir)/com/company
。 (这是要搜索的make文件的目录。)这将为每个.proto文件生成一个.o文件,为parser.cc生成一个.o文件。然后将它们组合成单个.so文件,该文件可以按我们的预期使用。
如果遇到类似问题,请随时提问。
关于c++ - 使用ProtocolBuffer时,是否可以为生成的C++代码指定输出导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63625696/