如何从Eclipse中的另一个文件夹中的一个文件夹导入protobuf文件?

时间:2016-01-07 15:00:45

标签: java eclipse protocol-buffers

我有一个现有的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”。

2 个答案:

答案 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