mac配置libevet出现bufferevent_openssl.c:66:10: fatal error: 'openssl/bio.h' file not found

本文介绍了一种解决make过程中出现错误的方法。通过在bash_profile中添加特定的环境变量配置,可以有效地解决由于缺少openssl依赖导致的问题。具体操作为添加两条配置指令,分别用于指定openssl的包含文件路径和库文件路径。

解决办法:
在bash_profile中配置环境变量加上下面两行
export CPPFLAGS=-I/usr/local/opt/openssl/include
export LDFLAGS=-L/usr/local/opt/openssl/lib
再重新make即可

OpenWrt-libtool: compile: aarch64-openwrt-linux-musl-gcc -DHAVE_CONFIG_H -I. -I./compat -I./include -I./include -I/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/staging_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/usr/include -I/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/staging_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/include -I/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/staging_dir/usr-be68_be77/include -I/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/../sdk/mtk798x/openwrt-21.02/staging_dir/toolchain-aarch64_cortex-a53_gcc-8.4.0_musl/include -fpic -MT bufferevent_openssl.lo -MD -MP -MF .deps/bufferevent_openssl.Tpo -c bufferevent_openssl.c -fPIC -DPIC -o .libs/bufferevent_openssl.o bufferevent_openssl.c: In function 'bio_bufferevent_new': bufferevent_openssl.c:106:3: error: dereferencing pointer to incomplete type 'BIO' {aka 'struct bio_st'} b->init = 0; ^~ bufferevent_openssl.c: At top level: bufferevent_openssl.c:228:1: error: variable 'methods_bufferevent' has initializer but incomplete type static BIO_METHOD methods_bufferevent = { ^~~~~~ bufferevent_openssl.c:79:27: warning: excess elements in struct initializer #define BIO_TYPE_LIBEVENT 57 ^~ bufferevent_openssl.c:229:2: note: in expansion of macro 'BIO_TYPE_LIBEVENT' BIO_TYPE_LIBEVENT, "bufferevent", ^~~~~~~~~~~~~~~~~ bufferevent_openssl.c:79:27: note: (near initialization for 'methods_bufferevent') #define BIO_TYPE_LIBEVENT 57 ^~ bufferevent_openssl.c:229:2: note: in expansion of macro 'BIO_TYPE_LIBEVENT' BIO_TYPE_LIBEVENT, "bufferevent", ^~~~~~~~~~~~~~~~~ bufferevent_openssl.c:229:21: warning: excess elements in struct initializer BIO_TYPE_LIBEVENT, "bufferevent", ^~~~~~~~~~~~~ bufferevent_openssl.c:229:21: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:230:2: warning: excess elements in struct initializer bio_bufferevent_write, ^~~~~~~~~~~~~~~~~~~~~ bufferevent_openssl.c:230:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:231:2: warning: excess elements in struct initializer bio_bufferevent_read, ^~~~~~~~~~~~~~~~~~~~ bufferevent_openssl.c:231:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:232:2: warning: excess elements in struct initializer bio_bufferevent_puts, ^~~~~~~~~~~~~~~~~~~~ bufferevent_openssl.c:232:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:233:2: warning: excess elements in struct initializer NULL /* bio_bufferevent_gets */, ^~~~ bufferevent_openssl.c:233:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:234:2: warning: excess elements in struct initializer bio_bufferevent_ctrl, ^~~~~~~~~~~~~~~~~~~~ bufferevent_openssl.c:234:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:235:2: warning: excess elements in struct initializer bio_bufferevent_new, ^~~~~~~~~~~~~~~~~~~ bufferevent_openssl.c:235:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:236:2: warning: excess elements in struct initializer bio_bufferevent_free, ^~~~~~~~~~~~~~~~~~~~ bufferevent_openssl.c:236:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:237:2: warning: excess elements in struct initializer NULL /* callback_ctrl */, ^~~~ bufferevent_openssl.c:237:2: note: (near initialization for 'methods_bufferevent') bufferevent_openssl.c:228:19: error: storage size of 'methods_bufferevent' isn't known static BIO_METHOD methods_bufferevent = { ^~~~~~~~~~~~~~~~~~~ Makefile:766: recipe for target 'bufferevent_openssl.lo' failed make[6]: *** [bufferevent_openssl.lo] Error 1 make[6]: Leaving directory '/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/build_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/libevent-2.0.21-stable' Makefile:824: recipe for target 'all-recursive' failed make[5]: *** [all-recursive] Error 1 make[5]: Leaving directory '/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/build_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/libevent-2.0.21-stable' Makefile:569: recipe for target 'all' failed make[4]: *** [all] Error 2 make[4]: Leaving directory '/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/build_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/libevent-2.0.21-stable' Makefile:153: recipe for target '/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/build_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/libevent-2.0.21-stable/.built' failed make[3]: *** [/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/build_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/libevent-2.0.21-stable/.built] Error 2 make[3]: Leaving directory '/home/soho/code/be67/iplatform/board/model_mtk_mt798x/openwrt/package/libevent2' package/Makefile:13 openssl是1.1.1w,libevent2是2.0.19.怎么解决,给出详细处理方法
最新发布
11-06
你遇到的编译错误是由于 **OpenSSL 1.1.x 与 libevent-2.0.x 版本不兼容** 所致。具体来说,`libevent-2.0.21-stable`(你正在使用的版本)在设计时针对的是 OpenSSL 1.0.x API,而你当前使用的是 **OpenSSL 1.1.1w**,其内部结构(如 `BIO`, `BIO_METHOD` 等)已经发生变化,导致出现以下典型问题: --- ### ❌ 主要错误分析 ```c error: dereferencing pointer to incomplete type 'BIO' {aka 'struct bio_st'} ``` → `BIO` 结构体不再公开(从 OpenSSL 1.1 开始私有化),不能直接访问成员。 ```c error: variable 'methods_bufferevent' has initializer but incomplete type ``` → `BIO_METHOD` 类型也无法直接定义初始化,因为结构体未暴露。 ```c warning: excess elements in struct initializer ``` → 尝试用旧方式初始化一个已经被改变布局或隐藏的结构。 这些都表明:**libevent-2.0.x 不支持 OpenSSL 1.1+ 的新 ABI**。 --- ## ✅ 解决方案 ### ✅ 方案一:升级 libevent 到支持 OpenSSL 1.1.x 的版本(推荐) > `libevent-2.0.x` 官方已停止维护,且对 OpenSSL 1.1 支持很差。 > > 推荐使用 **libevent-2.1 或更高版本**(最好是 2.1.12+ 或 2.2.x),它们原生支持 OpenSSL 1.1.x。 #### 步骤如下: #### 1. 修改 OpenWrt 的 libevent2 包为较新版(比如 2.1.12-stable) 假设你的 OpenWrt 路径为: ``` openwrt/package/libevent2/ ``` 进入该目录并修改 `Makefile` 文件。 ##### 示例 Makefile 修改内容: ```makefile include $(TOPDIR)/rules.mk PKG_NAME:=libevent # 使用 2.1.12-stable 版本 PKG_VERSION:=2.1.12 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-stable.tar.gz PKG_SOURCE_URL:=https://github.com/libevent/libevent/releases/download/release-$(PKG_VERSION)-stable PKG_HASH:=e10f89b3a48ead8357c86eed73ca66d8f45a8843419a45d459f899ac2c9788ef PKG_FIXUP:=autoreconf PKG_INSTALL:=1 PKG_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/package.mk define Package/libevent2/Default TITLE:=Event-driven network programming library (libevent) URL:=http://libevent.org/ endef define Package/libevent2 $(call Package/libevent2/Default) SECTION:=libs CATEGORY:=Libraries DEPENDS:=+zlib +OPENSSL_DEPENDS TITLE+= (shared library) endef TARGET_CFLAGS += $(FPIC) CONFIGURE_ARGS += \ --enable-shared \ --enable-static \ --disable-openssl-random \ --with-openssl=$(STAGING_DIR)/usr define Build/InstallDev $(INSTALL_DIR) $(1)/usr/include $(CP) $(PKG_INSTALL_DIR)/usr/include/event2 $(1)/usr/include/ $(INSTALL_DIR) $(1)/usr/lib $(CP) $(PKG_INSTALL_DIR)/usr/lib/libevent*.so* $(1)/usr/lib/ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libevent.pc $(1)/usr/lib/pkgconfig/ endef define Package/libevent2/install $(INSTALL_DIR) $(1)/usr/lib $(CP) $(PKG_INSTALL_DIR)/usr/lib/libevent*.so.* $(1)/usr/lib/ endef $(eval $(call BuildPackage,libevent2)) ``` > 注意: > - 更换了 `PKG_VERSION` 和源码地址; > - 添加了 `autoreconf`(因为新版 configure.ac 可能需要重新生成); > - 设置 `--with-openssl` 明确启用 OpenSSL; > - 移除了对旧版 BIO_METHOD 手动构造的支持代码(新版已修复); #### 2. 删除旧 build_dir 中的内容 ```bash rm -rf build_dir/target-aarch64-openwrt-linux-uclibc-be68_be77/libevent* ``` #### 3. 重新编译 ```bash make package/libevent2/compile V=s ``` ✅ 成功后将生成兼容 OpenSSL 1.1.1w 的 libevent 共享库。 --- ### ✅ 方案二:降级 OpenSSL 到 1.0.2(不推荐) 虽然可行,但 **OpenSSL 1.0.2 已于 2019 年底终止支持**,存在严重安全风险,强烈不建议用于生产环境。 如果你必须这么做,在 OpenWrt 配置中选择旧版 OpenSSL: ```bash make menuconfig ``` → 进入 `Library -> SSL` → 选择 `openssl-pre1.1` 或手动指定旧分支 ⚠️ 缺点: - 安全漏洞多 - 很多现代协议(TLS 1.3)不支持 - 后续软件包可能无法构建 --- ### ✅ 方案三:打补丁修复 libevent-2.0.x 对 OpenSSL 1.1 的兼容性(临时应急) 如果无法升级 libevent(例如依赖锁定),可以尝试给 `libevent-2.0.21-stable` 打社区提供的兼容补丁。 #### 补丁示例(适用于 bufferevent_openssl.c) 创建文件:`openwrt/package/libevent2/patches/100-openssl-1.1-compat.patch` ```patch --- a/bufferevent_openssl.c +++ b/bufferevent_openssl.c @@ -68,7 +68,7 @@ #define BIO_TYPE_LIBEVENT (0x1000 | BIO_TYPE_FILTER) #endif -#if OPENSSL_VERSION_NUMBER < 0x10100000L +#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x10100000L /* Helper macros for version compatibility */ #define BIO_get_data(bio) ((bio)->ptr) #define BIO_set_data(bio, ptr) do { (bio)->ptr = (ptr); } while (0) @@ -103,7 +103,11 @@ static int bio_bufferevent_new(BIO *bio) { struct bufferevent_private *bufev_p; +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + bufev_p = OPENSSL_zalloc(sizeof(*bufev_p)); + BIO_set_data(bio, bufev_p); +#else bufev_p = bio->ptr = OPENSSL_zalloc(sizeof(*bufev_p)); +#endif if (!bufev_p) return 0; bufev_p->flags = 0; @@ -225,19 +229,33 @@ static long bio_bufferevent_ctrl(BIO *bio, int cmd, long num, void *ptr) return result; } +#if OPENSSL_VERSION_NUMBER < 0x10100000L static BIO_METHOD methods_bufferevent = { BIO_TYPE_LIBEVENT, "bufferevent", bio_bufferevent_write, bio_bufferevent_read, bio_bufferevent_puts, NULL, /* no gets */ bio_bufferevent_ctrl, bio_bufferevent_new, bio_bufferevent_free, NULL, /* callback_ctrl */ }; +#else +static BIO_METHOD *methods_bufferevent = NULL; +#endif int bufferevent_ssl_init(void) { +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + methods_bufferevent = BIO_meth_new(BIO_TYPE_LIBEVENT, "bufferevent"); + if (!methods_bufferevent || + !BIO_meth_set_write(methods_bufferevent, bio_bufferevent_write) || + !BIO_meth_set_read(methods_bufferevent, bio_bufferevent_read) || + !BIO_meth_set_ctrl(methods_bufferevent, bio_bufferevent_ctrl) || + !BIO_meth_set_create(methods_bufferevent, bio_bufferevent_new) || + !BIO_meth_set_destroy(methods_bufferevent, bio_bufferevent_free)) { + return -1; + } +#endif return 0; } ``` > 💡 此补丁做了以下事: > - 判断 OpenSSL 版本是否 ≥ 1.1.0 > - 若是,则使用新的 `BIO_meth_new()` 和 `BIO_meth_set_xxx()` 函数动态创建 `BIO_METHOD` > - 否则沿用旧的静态初始化 > - 修复 `BIO_get_data` / `BIO_set_data` 宏缺失问题 然后确保 `Makefile` 中启用了 autoreconf(否则 configure 不识别新宏): ```makefile PKG_FIXUP:=autoreconf ``` --- ## 🔍 如何确认成功? 编译完成后检查日志是否有类似输出: ```bash checking for OpenSSL... yes configure: Using OpenSSL header: /home/.../staging_dir/usr/include/openssl/ssl.h configure: Using OpenSSL lib: -lssl -lcrypto ``` 运行目标设备上测试程序,确保 TLS 连接正常。 --- ## 🧩 总结对比 | 方案 | 是否推荐 | 说明 | |------|----------|------| | 升级到 libevent-2.1.12+ | ✅ 强烈推荐 | 原生支持 OpenSSL 1.1,长期稳定 | | 打补丁修复 libevent-2.0.x | ⚠️ 仅应急 | 可行但不稳定,后续维护难 | | 降级 OpenSSL 到 1.0.2 | ❌ 不推荐 | 安全风险高,功能受限 | --- ## ✅ 最终建议 👉 **立即升级 libevent 到 2.1.12 或以上版本**,这是最干净、安全、可持续的解决方案。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值