源码安装libcurl后yum出错,pycurl.so: undefined symbol: CRYPTO_set_locking_callback

本文解决了一个在CentOS上安装libcurl模块后使用yum命令出现的错误问题。原因是新安装的libcurl缺少SSL支持。通过编译安装SSL并配置libcurl来启用SSL支持,最终解决了这个问题。

最近项目需要在centos上默认配置源码安装了libcurl模块,导致使用yum命令时出现如下错误,(实际在很多使用libcurl的地方都会出错)。

/usr/lib64/python2.6/site-packages/pycurl.so: undefined symbol: CRYPTO_set_locking_callback


经过ldd  /usr/lib64/python2.6/site-packages/pycurl.so命令可知依赖于libcurl.so.4文件,该文件为新安装的libcurl文件,可知依赖从原来的系统libcurl被改为新安装的libcurl。(原来的libcurl.so.4应该还能在/usr/lib64/目录下找到)

CRYPTO_set_locking_callback实际上是与ssl相关的资源。

由于默认安装时没有指明安装ssl模块,导致新依赖的libcurl缺少ssl,从而出现如上错误。

解决方法:

下载ssl,编译安装,

./config --shared  (注意需要使能--share动态库模块,否则后续编译libcurl出错)

make && make install              (ssl默认安装在/usl/local/ssl/目录下)

然后设置动态库路径export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib


重新编译安装libcurl执行

./configure --with-ssl=/usr/local/ssl/ 

make  && make install


最后将libcurl安装目录(/usr.local/lib/)和/usr/local/ssl/lib/ 写入 /etc/ld.so.conf文件

ldconfig更新链接目录缓存


重新执行yum成功!

<think> 我们正在处理一个编译链接错误,错误信息显示在链接libcurl.so时出现了对ENGINE_get_next, ENGINE_get_first, ENGINE_load_private_key等函数的未定义引用。这些函数属于OpenSSL的ENGINE API,通常用于硬件加速和硬件安全模块(HSM)等场景。 根据引用[1]的内容,CURLE_NOT_BUILT_IN错误表示在编译libcurl时没有包含某个特性或协议,这可能是由于构建时的配置选项决定的。因此,这个问题很可能与libcurl在编译时没有正确链接OpenSSL(或者具体地说,没有启用ENGINE支持)有关。 错误原因分析: 1. 编译libcurl时没有正确链接OpenSSL:在链接阶段,如果libcurl需要调用OpenSSL的ENGINE相关函数,但在链接时没有找到对应的OpenSSL库(特别是libcrypto),则会出现未定义引用错误。 2. libcurl配置选项不正确:在构建libcurl时,可能没有启用OpenSSL支持,或者启用了OpenSSL但没有启用ENGINE支持(OpenSSL的ENGINE支持可能需要显式开启)。 3. 动态库版本不匹配:系统中可能存在多个版本的OpenSSL,而libcurl链接到了不包含ENGINE支持的版本,或者链接到了错误的版本。 解决方案: 1. 确认系统中安装了OpenSSL的开发包。例如,在Ubuntu/Debian系统上,可以安装`libssl-dev`包;在CentOS/RHEL系统上,可以安装`openssl-devel`包。 2. 重新编译libcurl,并确保在配置时启用了OpenSSL支持,特别是要启用ENGINE支持(通常OpenSSL的ENGINE支持是默认开启的,但需要确认)。 - 在配置libcurl时,使用如下配置选项(以源码编译为例): ```bash ./configure --with-openssl ``` 或者,如果已经安装了OpenSSL但在非标准路径,可以指定路径: ```bash ./configure --with-openssl=/path/to/openssl ``` 3. 如果在配置OpenSSL时禁用了ENGINE(例如通过配置OpenSSL时使用了`no-engine`选项),则需要重新编译OpenSSL并启用ENGINE。默认情况下,OpenSSL是启用ENGINE的,所以通常不需要特别设置。 4. 检查libcurl链接的OpenSSL库是否正确。可以使用`ldd`命令查看libcurl.so所依赖的库,确认它链接到了正确的libcrypto.so。例如: ```bash ldd /path/to/libcurl.so | grep libcrypto ``` 确保输出的libcrypto.so的版本是包含这些函数的版本。 5. 如果是静态链接,确保在链接应用程序时,除了链接libcurl,还要链接libcrypto(以及可能需要的libssl)。例如,在gcc命令行中,需要在libcurl之后加上`-lcrypto`(有时还需要`-lssl`): ```bash gcc ... -lcurl -lssl -lcrypto ``` 因为链接器在解析依赖时是按照顺序进行的,所以通常需要将基础库放在后面。 6. 如果问题仍然存在,可能需要检查OpenSSL的安装是否包含了ENGINE功能。可以通过以下命令检查OpenSSL是否支持ENGINE: ```bash openssl engine ``` 如果支持,应该会列出可用的引擎。如果不支持,可能需要重新安装OpenSSL(确保没有使用`no-engine`选项编译)。 根据引用[3]的内容,我们了解到libcurl的某些功能依赖于OpenSSL,而且编译时的配置选项非常重要。因此,重新编译libcurl并确保正确链接到OpenSSL通常是解决这类问题的关键。 建议步骤总结: 1. 安装或更新OpenSSL开发包。 2. 重新编译libcurl,配置时明确指定OpenSSL支持(使用`--with-openssl`)。 3. 如果OpenSSL的安装路径非标准,确保在编译libcurl时正确指定路径。 4. 在链接最终应用程序时,确保链接了libcrypto(和libssl),并且顺序正确(在libcurl之后)。 如果以上步骤不能解决问题,可能需要检查OpenSSL的编译选项,确保其支持ENGINE。 相关问题: 1. 如何检查系统是否安装了OpenSSL开发包? 2. 如何查看libcurl编译时的配置选项? 3. 如何在Linux下重新编译并安装libcurl? 4. OpenSSL的ENGINE是什么?它有什么作用? </think> 根据提供的错误信息和引用内容,分析`libcurl.so`出现`undefined reference to ENGINE_get_next`等错误的原因及解决方案如下: ### 错误原因分析 1. **OpenSSL引擎支持缺失** `ENGINE_get_next`、`ENGINE_get_first`等函数属于OpenSSL的引擎API。错误表明: - 编译libcurl时未启用OpenSSL引擎支持 - 链接时缺少`libcrypto`库(OpenSSL的核心库) - 可能使用了不兼容的OpenSSL版本(引擎API在OpenSSL 1.1.x和3.x中有差异) 2. **构建配置问题** 引用[1]提到`CURLE_NOT_BUILT_IN`错误,说明某些功能在编译时被禁用。此处极可能是: ```bash ./configure --without-engine # 显式禁用引擎支持 ``` 3. **库链接顺序错误** 链接时若未正确排序依赖库,会导致符号解析失败: ```bash # 错误顺序(libcurl在openssl之前) gcc -lcurl -lcrypto -o program # ENGINE_*符号未解析 ``` --- ### 解决方案 #### 1. 重新编译libcurl(推荐) ```bash # 确保安装OpenSSL开发包 sudo apt-get install libssl-dev # Debian/Ubuntu sudo yum install openssl-devel # CentOS/RHEL # 编译时启用引擎支持 ./configure --with-openssl --enable-ssl-engine make clean && make && sudo make install ``` #### 2. 显式链接libcrypto 在应用程序的链接命令中**最后**添加`-lcrypto`: ```bash # 正确链接顺序(基础库在最后) gcc your_program.c -lcurl -lssl -lcrypto -o program ``` #### 3. 验证OpenSSL引擎支持 ```bash # 检查当前OpenSSL是否支持引擎 openssl engine -c # 若输出包含(dynamic) Engine support,则支持 ``` #### 4. 版本兼容性处理 若使用OpenSSL 3.0+: ```c // 代码中需初始化引擎 #include <openssl/engine.h> ENGINE_load_builtin_engines(); // 显式加载引擎 ``` --- ### 引用验证方法(参考引用[2]) 可通过curl测试HTTPS功能验证修复: ```bash # 检查curl是否支持SSL curl -v https://www.baidu.com 2>&1 | grep "SSL connection" # 使用脚本检测(修改自引用[2]) check_ssl_support() { curl -I https://www.baidu.com > /dev/null 2>&1 [ $? -eq 0 ] && echo "SSL support OK" || echo "SSL support FAIL" } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值