我有一个现有的eclipse项目,包括谷歌协议缓冲区。我正在尝试在新文件夹中添加新的.proto
,然后将其从.proto
添加到原始文件夹中。
当我尝试构建它时,我得到:
.. \ shared \ PanicShared.proto:虚拟路径中不允许使用反斜杠,连续斜线,“。”或“..”
如何在eclipse中引用另一个文件夹中的另一个.proto
?如果我使用绝对文件路径,那么项目将不可移植。
如果我只导入没有路径的“PanicShared.proto”,那么导入行本身不会出错,但是在PanicShared.proto中我有:
enum PanicLevel {
NORMAL = 0;
etc.
}
当我尝试在另一条消息中使用它时:
import "PanicShared.proto";
message PanicPremium {
repeated PanicLevel panicPremiumLevels = 11;
}
我收到错误:
[protoc] PanicPremium.proto:9:12:“PanicLevel”未定义。
[protoc] [libprotobuf警告google / protobuf / descriptor.cc:5411]警告:>未使用导入:“PanicPremium.proto”导入未使用的“PanicShared.proto”。
答案 0 :(得分:6)
我通常通过做亲戚包括来解决这个问题。
所以如果这是我的结构:
project
+- dir1
+- file1.proto
+- dir2
+- file2.proto
我希望file1.proto
包含file2.proto
我这样做:
protoc -I ../dir2 <other args you need> file1.proto
在file1中它会说:
import "file2.proto";
这是我的机器上的一个经过实例的例子:
$ find `pwd` -type f
/tmp/so/shared/PanicShared.proto
/tmp/so/main/Main.proto
$ cat /tmp/so/shared/PanicShared.proto
enum PanicLevel {
NORMAL = 0;
}
$ cat /tmp/so/main/Main.proto
import "PanicShared.proto";
message PanicPremium {
repeated PanicLevel panicPremiumLevels = 11;
}
$ cd /tmp/so/shared
$ protoc -I . PanicShared.proto --cpp_out=.
$ g++ PanicShared.pb.cc -c -o PanicShared.pb.o
$ cd /tmp/so/main
$ protoc -I . -I ../shared Main.proto --cpp_out=.
$ g++ Main.pb.cc -c -o Main.pb.o -I ../shared
$ protoc --version
libprotoc 2.5.0
$ cd /tmp/so/
$ find `pwd` -type f
/tmp/so/shared/PanicShared.pb.cc
/tmp/so/shared/PanicShared.proto
/tmp/so/shared/PanicShared.pb.h
/tmp/so/shared/PanicShared.pb.o
/tmp/so/main/Main.pb.o
/tmp/so/main/Main.pb.h
/tmp/so/main/Main.proto
/tmp/so/main/Main.pb.cc
答案 1 :(得分:1)
实际上有两个问题导致此失败。
第一个是我需要将文件添加到包含路径,然后只使用文件的非限定名称(即只是“PanicShared.proto”)。
第二个是由于某种原因我需要限定对象的名称以从该文件引用它们。即shared.proto.PanicPremiumLevel
而非PanicPremiumLevel
。