Bazel构建RPC项目外部依赖失败问题求助
解决Bazel引入crc32c外部依赖构建失败的方案
针对你用http_archive引入com_github_google_crc32c作为外部依赖时构建失败的问题,结合你提供的配置,以下是可行的修复步骤:
1. 修正genrule输出路径与头文件引用逻辑
你的genrule生成的crc32c_config.h路径无法被cc_library正确识别,导致源码引用头文件失败。调整输出路径并将生成的头文件纳入cc_library的头文件列表:
genrule( name = "crc32c_config_h", srcs = ["src/crc32c_config.h.in"], # 修改输出路径到include/crc32c下,匹配strip_include_prefix规则 outs = ["include/crc32c/crc32c_config.h"], cmd = """ sed -e 's/#cmakedefine01/#define/' \ """ + select({ "@//bazel/config:brpc_with_sse42": """-e 's/ HAVE_SSE42/ HAVE_SSE42 1/' \ """, "//conditions:default": """-e 's/ HAVE_SSE42/ HAVE_SSE42 0/' \ """, }) + select({ "@//bazel/config:brpc_with_glog": """-e 's/ CRC32C_TESTS_BUILT_WITH_GLOG/ CRC32C_TESTS_BUILT_WITH_GLOG 1/' \ """, "//conditions:default": """-e 's/ CRC32C_TESTS_BUILT_WITH_GLOG/ CRC32C_TESTS_BUILT_WITH_GLOG 0/' \ """, }) + """-e 's/ BYTE_ORDER_BIG_ENDIAN/ BYTE_ORDER_BIG_ENDIAN 0/' \ -e 's/ HAVE_BUILTIN_PREFETCH/ HAVE_BUILTIN_PREFETCH 0/' \ -e 's/ HAVE_MM_PREFETCH/ HAVE_MM_PREFETCH 0/' \ -e 's/ HAVE_ARM64_CRC32C/ HAVE_ARM64_CRC32C 0/' \ -e 's/ HAVE_STRONG_GETAUXVAL/ HAVE_STRONG_GETAUXVAL 0/' \ -e 's/ HAVE_WEAK_GETAUXVAL/ HAVE_WEAK_GETAUXVAL 0/' \ < $< > $@ """, ) cc_library( name = "crc32c", srcs = [ "src/crc32c.cc", "src/crc32c_internal.h", "src/crc32c_portable.cc", "src/crc32c_prefetch.h", "src/crc32c_read_le.h", "src/crc32c_round_up.h", # 通过select条件添加平台相关源码,避免非目标平台编译错误 ] + select({ "@//bazel/config:brpc_with_sse42": [ "src/crc32c_sse42.cc", "src/crc32c_sse42.h", "src/crc32c_sse42_check.h", ], "//conditions:default": [], }) + select({ "@bazel_tools//src/conditions:arm64": [ "src/crc32c_arm64.cc", "src/crc32c_arm64.h", "src/crc32c_arm64_check.h", ], "//conditions:default": [], }), hdrs = [ "include/crc32c/crc32c.h", ":crc32c_config_h", # 将生成的配置头文件加入hdrs ], copts = [ "-std=c++11", # 添加crc32c所需的C++标准 ] + select({ "@//bazel/config:brpc_with_sse42": ["-msse4.2"], "//conditions:default": [], }), strip_include_prefix = "include", visibility = ["//visibility:public"], linkopts = select({ "@bazel_tools//src/conditions:linux": ["-lpthread"], # Linux下链接pthread依赖 "//conditions:default": [], }), )
2. 确保配置标志已正确定义
你使用的@//bazel/config:brpc_with_sse42和@//bazel/config:brpc_with_glog需要在项目的bazel/config/BUILD.bazel中定义对应的config_setting:
config_setting( name = "brpc_with_sse42", define_values = {"brpc_with_sse42": "1"}, ) config_setting( name = "brpc_with_glog", define_values = {"brpc_with_glog": "1"}, )
之后构建时可通过--define brpc_with_sse42=1或--define brpc_with_glog=1启用对应特性。
3. 修复测试目标的依赖问题
如果测试目标编译失败,需确保@com_google_googletest和@com_github_google_glog已正确引入到你的WORKSPACE文件中,同时测试源码需仅在启用glog时才引用相关头文件。
4. 清理缓存后重新构建
执行以下命令清理Bazel缓存,避免旧构建残留影响:
bazel clean --expunge bazel build @com_github_google_crc32c//:crc32c
内容的提问来源于stack exchange,提问作者fan
相关产品推荐
相关产品推荐

