【问题标题】:How do I import protobuf files from one folder in another folder in Eclipse?如何从 Eclipse 的另一个文件夹中的一个文件夹导入 protobuf 文件?
【发布时间】:2016-04-12 00:48:00
【问题描述】:

我有一个现有的 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 WARNING google/protobuf/descriptor.cc:5411] 警告:>未使用的导入:“PanicPremium.proto”导入未使用的“PanicShared.proto”。

【问题讨论】:

    标签: java eclipse protocol-buffers


    【解决方案1】:

    我通常通过做相对包含来解决这个问题。

    如果这是我的结构:

      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
    

    【讨论】:

    • 感谢您的回复,请参阅我编辑的问题 - 我想我可能更近了一步,但导入仍然无法正常工作。
    • 我添加了基于您的示例的完整跟踪。也许这可以帮助缩小差异。
    • 我能看到的唯一区别是 eclipse 正在为我生成命令 - 生成的命令看起来相同。我现在要回家了,但我明天再看看。与此同时,感谢您迄今为止的帮助:)
    【解决方案2】:

    实际上有两个问题导致此失败。

    首先是我需要将文件添加到包含路径,然后只使用文件的非限定名称(即“PanicShared.proto”)。

    第二个是由于某种原因,我需要限定对象的名称以从该文件中引用它们。即shared.proto.PanicPremiumLevel 不是PanicPremiumLevel

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2022-06-13
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多