问题描述
我正在尝试使用.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 --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,但概念相同) Makefile指定;
- parser.cc和所有生成的.cc文件作为源。
- $ LIBS标志
-fPIC -lprotobuf
(请注意,这里缺少-Lprotoc
,我沿着轨道进一步遇到错误。通常是关于未定义的符号) - $ INCFLAGS`-I $(srcdir)/ com / company```。 (这是make文件要包含在编译中的目录)
- $ VPATH
$(srcdir)/com/company
。 (这是make文件搜索的目录。)
这将为每个.proto文件生成一个.o文件,为parser.cc生成一个.o文件。然后将它们组合成单个.so文件,该文件可以按我们的预期使用。
如果遇到类似问题,请随时提问。