C++ 在协议缓冲区中,如何从上层目录导入文件?

C++ 在协议缓冲区中,如何从上层目录导入文件?,c++,protocol-buffers,C++,Protocol Buffers,我在协议缓冲区文件(pcfg_lm.proto)中有以下代码: 当然,在../types/language.proto中存在一个proto文件。但是,当我发出命令时: protoc pcfg_lm.proto --cpp_out=/tmp 以下是错误消息: ../types/language.proto: File not found. pcfg_lm.proto: Import "../types/language.proto" was not found or had errors. pc

我在协议缓冲区文件(pcfg_lm.proto)中有以下代码:

当然,在../types/language.proto中存在一个proto文件。但是,当我发出命令时:

protoc pcfg_lm.proto --cpp_out=/tmp
以下是错误消息:

../types/language.proto: File not found.
pcfg_lm.proto: Import "../types/language.proto" was not found or had errors.
pcfg_lm.proto:6:12: "Language" is not defined.
我认为必须有某种方法来指定上层目录中的文件名,而不使用-I标志。但是我该怎么做呢?

您可以使用--proto_path=指令指定要搜索导入的目录。如果需要,可以使用多次

正确的--proto_路径将取决于在导入的文件(language.proto)中如何定义包

  • 如果导入的文件(language.proto)包含包类型

    指定--proto_path=Parent directory并将导入更改为

    导入“types/language.proto”

  • 如果导入的文件没有包

    指定--proto_path=Parent directory/types并将导入更改为

    导入“language.proto”


  • 我遇到了同样的问题,但我不记得解决办法了。IIRC导入路径是相对于调用protoc的目录进行解释的,而不是相对于当前proto文件本身。或者类似的…是的,我刚找到一些旧的原始代码。正如我所描述的。我从projects基本目录调用protoc,比如
    protoc--cpp_out=graph/node.proto-graph/edge.proto
    ,在edge中有
    import“graph/node.proto”
    即使两个文件都在同一个目录中。您还可以在proto path中指定一个jar吗?@Brue Matrin,对于python,您的解决方案将给出异常:在运行导入了pcfg_lm_pb2.py的python脚本时,pcfg_lm.proto:Import“language.proto”尚未加载--proto_path=“如果需要,可以多次使用它。”-这帮了大忙,谢谢。
    ../types/language.proto: File not found.
    pcfg_lm.proto: Import "../types/language.proto" was not found or had errors.
    pcfg_lm.proto:6:12: "Language" is not defined.