Bazel中统一管理Proto文件及proto_library配置与头文件引用问题
Bazel Proto文件管理与编译问题
我希望将项目中各方提供的所有Proto文件统一放在一个文件夹中,尝试按以下方式指定proto srcs但遇到问题:
proto_library( name='addressbook', srcs=['proto/addressbook.proto'] ) cc_proto_library( name='cc_addressbook', deps=[':addressbook'] ) cc_binary( name='write', srcs=['write.cpp'], deps=[':cc_addressbook'] ) cc_binary( name='read', srcs=['read.cpp'], deps=[':cc_addressbook'] )
作为Bazel新手,我有以下疑惑:
- 是否需要在proto目录的BUILD文件中创建
srcs=["addressbook.proto"]的filegroup并作为依赖传入proto_library? - 如何正确给proto_library传递srcs参数?
- 在write.cpp、read.cpp中应使用何种包含路径才能正确引入生成的头文件?
解答
1. 是否需要filegroup?
不需要额外创建filegroup。Bazel的proto_library可以直接指定srcs为proto文件路径,只要路径匹配实际文件位置,就能直接识别,无需通过filegroup中转。
2. 正确传递proto_library的srcs参数
你的写法本身是合法的,但要结合目录结构调整:
- 若当前BUILD文件在项目根目录,且proto文件确实放在
proto/子目录下,srcs=['proto/addressbook.proto']的写法完全正确。 - 若追求更规范的模块拆分(适合多文件项目),可以在
proto/目录下单独创建BUILD文件:
然后在根目录BUILD中通过绝对标签引用:# proto/BUILD proto_library( name='addressbook', srcs=['addressbook.proto'], visibility=['//visibility:public'] # 允许根目录的target引用 )cc_proto_library( name='cc_addressbook', deps=['//proto:addressbook'] )
3. C++代码中引入生成的头文件
Bazel会根据proto文件的package声明和文件路径生成头文件路径。假设你的addressbook.proto中写了package tutorial;,那么生成的头文件路径为tutorial/addressbook.pb.h。
在write.cpp和read.cpp中直接按此路径包含即可:
#include "tutorial/addressbook.pb.h"
无需手动指定生成文件的输出目录,只要代码的target依赖了cc_addressbook,Bazel会自动把生成头文件的目录加入编译的include路径,确保编译器能找到。
注意:务必在proto文件中声明正确的package,否则生成的头文件路径会不符合预期。
内容的提问来源于stack exchange,提问作者a k
相关产品推荐
相关产品推荐

