跨不同路径导入Proto文件失败的解决方法咨询
跨文件夹Proto文件导入操作步骤
核心规则前置说明
Protobuf的import路径不基于当前编写的proto文件所在的本地路径解析,而是基于编译时通过--proto_path(简写为-I)参数指定的搜索根目录做相对路径匹配。
具体操作步骤
- 第一步:梳理目录结构,确定导入搜索根
以你给出的场景为例,目录结构参考如下:
你可以选择「所有proto的公共父目录」作为统一搜索根,也可以分别把公共父目录/ ├─ abc/ │ └─ protos/ │ └─ ProtoA.proto └─ def/ └─ protos/ └─ ProtoB.protoabc/protos、def/protos都加入搜索根列表。 - 第二步:调整ProtoA中的import写法
注意路径必须用正斜杠/,不要用Windows系统的反斜杠\,也不要用多个.开头的相对路径
如果你选择公共父目录作为唯一搜索根,导入写法为:
如果你选择分别把两个protos目录加入搜索根,导入写法可以简化为:import "def/protos/ProtoB.proto";import "ProtoB.proto"; - 第三步:编译时正确指定搜索根参数
执行protoc编译命令时,通过-I参数传入你确定的搜索根:
公共父目录作为搜索根的编译命令示例:
双目录加入搜索根的编译命令示例:# 执行命令时所处位置为公共父目录,输出路径可根据需要调整 protoc -I ./ --cpp_out=./编译输出路径 abc/protos/ProtoA.proto# 执行命令时所处位置为公共父目录 protoc -I ./abc/protos -I ./def/protos --cpp_out=./编译输出路径 ProtoA.proto
常见踩坑说明
- 禁止在import路径中使用反斜杠
\,protobuf官方语法仅支持正斜杠作为路径分隔符,全平台通用 - 不要使用多层
../这类相对于当前proto文件的路径,编译器不会识别这类路径,所有导入路径均是相对于-I指定的搜索根的相对路径 - 如果涉及多层嵌套导入,所有被导入proto所在的父目录,都需要被加入到
-I的搜索根列表中
内容的提问来源于stack exchange,提问作者Amy
相关产品推荐
相关产品推荐

