编译curl 8.8.0遇OpenSSL函数未定义引用错误求助
编译curl 8.8.0时OpenSSL符号未定义错误的排查与解决
问题描述
从curl官方网站下载curl-8.8.0 tar包后执行编译:
cd curl-8.8.0 sudo ./configure --with-openssl sudo make
执行sudo make时出现链接错误:
make[2]: Entering directory '/usr/src/curl-8.8.0/src' CCLD curl ../lib/.libs/libcurl.so: undefined reference to `EVP_PKEY_get_group_name' ../lib/.libs/libcurl.so: undefined reference to `SSL_get0_group_name' ../lib/.libs/libcurl.so: undefined reference to `EVP_PKEY_get_security_bits' ../lib/.libs/libcurl.so: undefined reference to `X509_STORE_load_file' ../lib/.libs/libcurl.so: undefined reference to `EVP_PKEY_get_id' ../lib/.libs/libcurl.so: undefined reference to `EVP_PKEY_get_bits' ../lib/.libs/libcurl.so: undefined reference to `SSL_get1_peer_certificate' ../lib/.libs/libcurl.so: undefined reference to `X509_STORE_load_path' ../lib/.libs/libcurl.so: undefined reference to `EVP_PKEY_get_bn_param' ../lib/.libs/libcurl.so: undefined reference to `EVP_PKEY_get0_type_name' collect2: error: ld returned 1 exit status make[2]: *** [Makefile:1048: curl] Error 1 make[2]: Leaving directory '/usr/src/curl-8.8.0/src' make[1]: *** [Makefile:1553: all-recursive] Error 1 make[1]: Leaving directory '/usr/src/curl-8.8.0/src' make: *** [Makefile:1224: all-recursive] Error 1
已手动升级OpenSSL至最新版本:
$ openssl --version OpenSSL 3.3.1 4 Jun 2024 (Library: OpenSSL 3.3.1 4 Jun 2024)
主机环境:
$ uname -a Linux alpps789 4.18.0-513.24.1.el8_9.x86_64 #1 SMP Thu Mar 14 14:20:09 EDT 2024 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/redhat-release Red Hat Enterprise Linux release 8.10 (Ootpa)
原因分析
这些未定义符号均为OpenSSL 3.x新增的API接口。虽然你已升级OpenSSL到3.3.1,但curl的configure脚本未正确识别手动安装的新版本,而是默认链接了RHEL 8系统自带的旧版OpenSSL(1.1.1系列)。系统中多版本OpenSSL共存时,configure优先检测到旧版的头文件和库,导致编译出的libcurl依赖旧版API,最终链接阶段出现符号缺失。
解决步骤
1. 清理编译残留
先彻底清除之前的编译生成文件,避免缓存干扰:
cd curl-8.8.0 sudo make clean sudo rm -rf config.log config.status Makefile
2. 强制指定OpenSSL路径给configure
假设OpenSSL 3.3.1安装在/usr/local/openssl(替换为你的实际安装路径),执行configure时明确指定路径:
sudo ./configure --with-openssl=/usr/local/openssl
执行完成后,检查config.log确认版本检测结果:
grep "OpenSSL version" config.log
预期输出包含OpenSSL version: OpenSSL 3.3.1。
3. 重新编译安装
sudo make sudo make install
4. 配置系统优先加载新版库
确保系统能找到新安装的OpenSSL和curl库:
- 创建并编辑
/etc/ld.so.conf.d/openssl.conf:/usr/local/openssl/lib - 创建并编辑
/etc/ld.so.conf.d/curl.conf:/usr/local/lib - 更新系统库缓存:
sudo ldconfig
5. 验证安装结果
curl --version
输出中应显示OpenSSL/3.3.1,说明curl已正确链接新版OpenSSL。
内容的提问来源于stack exchange,提问作者Shashank Shekhar
相关产品推荐
相关产品推荐

