Bazel构建依赖brpc的C++项目失败:排查头文件找不到问题
排查Bazel配置错误及修复方案
核心问题1:依赖源冲突
你同时通过两种方式引入brpc,导致Bazel解析逻辑混乱:
- WORKSPACE中用
git_repository拉取远程仓库作为@brpc - 本地
third_party/brpc下自定义BUILD文件
Bazel解析@brpc//:brpc时会优先使用远程仓库的配置,而非本地third_party的代码,直接导致本地BUILD完全无效。必须二选一:
- 若使用远程brpc:删除本地
third_party/brpc的BUILD配置,apache/incubator-brpc仓库本身提供Bazel支持,可直接依赖其内置的:brpc目标 - 若使用本地third_party的brpc:删除WORKSPACE中的
git_repository配置,直接在本地管理brpc源码
核心问题2:本地third_party/brpc的BUILD配置错误
如果选择本地管理brpc,以下是BUILD的关键修正点:
- 头文件字段错误:头文件应放在
hdrs字段,srcs仅存放.cpp源文件 - include路径不匹配:当前
includes、strip_include_prefix的配置与brpc的源码结构(src/brpc/下的头文件)完全不匹配 - 缺失必要依赖:brpc依赖protobuf、gflags等库,空
deps会导致后续编译失败
修正后的BUILD示例:
load("@rules_cc//cc:defs.bzl", "cc_library") cc_library( name = "brpc", srcs = glob([ "src/brpc/*.cpp", "src/bthread/*.cpp", ]), hdrs = glob([ "src/brpc/*.h", "src/bthread/*.h", ]), deps = [ # 根据brpc实际依赖补充,例如: # "@com_google_protobuf//:protobuf", # "@gflags//:gflags", ], includes = ["src"], # 让依赖方能够找到src目录下的子路径 include_prefix = "brpc", # 业务代码中用#include <brpc/xxx.h>引入头文件 strip_include_prefix = "src/brpc", # 移除路径中的src/brpc前缀,与include_prefix对应 visibility = ["//visibility:public"], )
额外排查步骤
执行构建时添加--verbose_failures参数,查看具体找不到的头文件路径,便于精准调整配置:
bazel build //client:client --verbose_failures
内容的提问来源于stack exchange,提问作者whoisyao
相关产品推荐
相关产品推荐

