在Mac上用Bazel 5.0+Clang修复本地OpenSSL头文件引用问题
修复Bazel下本地OpenSSL头文件引用问题
针对你在Mac+Bazel 5.0+clang环境下遇到的OpenSSL头文件找不到的两类错误,以下是有效的修复方案:
1. 正确配置OpenSSL的cc_library规则
在external/openssl目录下创建或修改BUILD文件,内容如下:
cc_library( name = "openssl", srcs = [ "libcrypto.a", "libssl.a", ], hdrs = glob(["include/openssl/*.h"]), includes = ["include"], # 核心配置:将include目录加入头文件搜索路径 visibility = ["//visibility:public"], )
配置说明:
includes = ["include"] 会让Bazel在编译时自动为clang添加 -I external/openssl/include 参数。这样:
- 代码中
#include <openssl/conf.h>会直接匹配external/openssl/include/openssl/conf.h,解决错误1; conf.h内部的#include <openssl/macros.h>也会在external/openssl/include/openssl下找到对应文件,解决错误2。
2. 确保WORKSPACE中正确引入本地OpenSSL
在项目根目录的WORKSPACE文件中添加本地仓库引用:
local_repository( name = "openssl", path = "./external/openssl", )
3. 验证依赖引用
在需要依赖OpenSSL的目标(比如rules_boost相关目标)的BUILD规则中,添加@openssl//:openssl作为依赖,例如:
cc_binary( name = "your_target", srcs = ["your_source.cpp"], deps = [ "@openssl//:openssl", "@boost//:asio", # 其他依赖 ], )
为什么之前的尝试无效?
includes = ["external/openssl/include/openssl"]:路径是相对BUILD文件所在目录的,会生成错误的-I路径,导致头文件搜索位置错误;includes = ["include/openssl"]:会让clang在external/openssl/include/openssl下搜索,此时#include <openssl/conf.h>会去寻找external/openssl/include/openssl/openssl/conf.h,显然不存在;strip_include_prefix = "include/openssl":会将头文件的前缀去掉,此时代码中需要写#include <conf.h>才能匹配,但你的代码用的是#include <openssl/conf.h>,不兼容。
验证编译参数
如果仍有问题,可执行以下命令查看编译时的clang参数,确认是否包含-I external/openssl/include:
bazel build --verbose_failures //your:target
内容的提问来源于stack exchange,提问作者Andrew Katson
相关产品推荐
相关产品推荐

