我不太明白原始人的路线。我的文件布局如下:
- B
- 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_*错误。
发布于 2013-09-12 00:07:58
对于每个.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++编译器时,可以在包含路径中指定源文件目录和生成文件目录。
如果您有其他设置--例如,.proto文件位于与.pb.h文件不同的规范路径--那么不幸的是,您在让protoc做您想做的事情时会遇到一些困难。尽管,考虑到您正在编写自定义代码生成器,您可以根据其输出文件的组织方式发明任何您想要的规则,但是偏离标准代码生成器遵循的规则可能会导致许多小问题。
https://stackoverflow.com/questions/18735609
复制相似问题