protobuf中的路径

Qin*_*Yun 3 c++ protocol-buffers

我不太了解protobuf的路径.我的文件布局如下:

  • 最佳
    • 一个
      • a.proto
    • C
      • c.proto // import "A/a.proto";

我已经编写了一个基于protobuf的RPC系统,我需要生成两种文件(客户端和服务器代码)c.proto.客户端代码应放在B中,服务器代码仍放在C中.

我无法写出正确的命令.

Top> protoc -I=. --client_out=./B/ C/c.proto将生成客户端代码,B/C#include在代码中将有一个错误的路径.

Top/C> protoc -I=../ -I=./ --client_out=./ ./c.proto导致protobuf_AddDesc_*错误.

Ken*_*rda 10

对于每个.proto文件,protoc尝试确定文件的"规范名称" - 这个名称可以将其与.proto可能进入系统的任何其他文件区分开来.实际上,理想情况下,规范名称.proto与世界上的其他文件不同.规范名称是.proto从其他.proto文件导入文件时使用的名称.它还用于决定生成文件的输出位置以及#include生成的内容.

对于.proto在命令行上指定的文件,protoc通过尝试确定用于导入该文件的名称来确定规范名称.因此,它通过导入路径(指定-I)并查找作为文件名前缀的路径.然后删除该前缀以确定规范名称.

在您的情况下,如果您指定-I=. C/c.proto,则规范名称为C/c.proto.如果您指定-I=C C/c.proto,那么规范名称就是c.proto.

重要的是,任何尝试导入.proto文件的文件都会使用编译文件本身时确定的规范名称来导入它.否则,您将收到链接器错误AddDesc.

一般来说,如果您将某个目录指定为源树的"根",并且所有代码都位于具有指定项目的唯一名称的子目录中,则一切运行良好.你的"根"目录应该是你传递给这两个目录-I--client_out.或者,您可以为源文件与生成的文件分别创建目录,但生成的文件目录应具有镜像源目录的内部结构.然后,您可以指定生成的文件目录--client_out,并在运行C++编译器时,在include路径中指定源文件目录和生成的文件目录.

如果您有其他设置 - 例如.proto文件位于文件的不同规范路径中.pb.h- 那么很遗憾,您将无法protoc按照自己的意愿进行操作.虽然,鉴于您正在编写自定义代码生成器,您可以为其输出文件的组织方式创建您想要的任何规则,但是偏离标准代码生成器遵循的规则可能会导致许多小缺陷.