配置Boost使用LibreSSL替代OpenSSL,解决运行时异常问题
解决方案
1. 先清掉Boost的旧构建缓存
先删了Boost目录下的bin.v2文件夹,免得之前和OpenSSL相关的编译缓存搞事:
rm -rf /path/to/boost/bin.v2
2. 编译Boost时指定LibreSSL并适配参数
直接替换同名库行不通,得在编译Boost的时候就明确指向LibreSSL,还要加适配的宏。运行Boost的b2命令时带上这些参数:
./b2 \ --with-system \ --with-asio \ --with-crypto \ openssl-include=/path/to/libressl/include \ openssl-lib=/path/to/libressl/lib \ define=BOOST_ASIO_USE_LIBRESSL \ link=static|shared \ threading=multi \ variant=release|debug
- 把
openssl-include和openssl-lib换成你实际的LibreSSL安装路径; BOOST_ASIO_USE_LIBRESSL这个宏是核心,它告诉Boost.Asio用LibreSSL而非默认的OpenSSL,能自动处理大部分API差异;- 按需选
link(静态/动态库)、threading(多线程)、variant(发布/调试版本)的选项。
3. 验证Boost库的链接情况
编译完之后,检查生成的Boost库是不是真的连到LibreSSL了,Linux用ldd,macOS用otool -L:
ldd /path/to/boost/lib/libboost_system.so
输出里应该显示LibreSSL的库文件(比如libssl.so、libcrypto.so),不是OpenSSL的。
4. 自己的项目编译也要同步配置
编译你的应用时,得同步做这几件事:
- 把LibreSSL的头文件路径加到编译参数里;
- 链接LibreSSL的库(
-lssl -lcrypto); - 定义
BOOST_ASIO_USE_LIBRESSL宏。
给个Makefile片段参考:
CXXFLAGS += -I/path/to/boost/include -I/path/to/libressl/include -DBOOST_ASIO_USE_LIBRESSL LDFLAGS += -L/path/to/boost/lib -L/path/to/libressl/lib -lboost_system -lboost_asio -lssl -lcrypto
5. 版本兼容性要注意
- LibreSSL版本别低于3.0.0,旧版本API兼容问题多;
- Boost版本别低于1.70.0,新一点的Boost对LibreSSL支持更到位。
还不行的话排查这些点
如果还是出Invalid argument异常,试试:
- 检查代码里有没有直接调用OpenSSL独有的API(比如
SSL_CTX_set_alpn_protos的某些参数),LibreSSL对部分API的参数要求不一样; - 开Boost的调试日志,加
BOOST_ASIO_ENABLE_HANDLER_TRACKING宏,看看异常具体在哪一步触发的,定位是哪个SSL操作出的错。
内容的提问来源于stack exchange,提问作者Ajin Pradeep
相关产品推荐
相关产品推荐

