Libcurl使用OpenSSL编译出现undefined reference to `COMP_CTX_free'错误备忘

在使用Libcurl库编译支持SSL的项目时,遇到编译错误提示未定义的引用`COMP_CTX_free'。解决方法是调整链接库的顺序,确保-lssl在-lcrypto之前。此问题并不在Ubuntu提供的库中出现,作者在GitHub上分享了相关代码和Makefile供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2014-04-22 wcdj


在上篇文章中《Libcurl库支持SSL协议的编译方法》完成了对Libcurl库(支持SSL/TSL)的编译。然后用此库在编译demo时发现了如下编译错误:

$make -f demo_makefile 
g++  -o http_demo http_demo.o -L../../lib/ -L../../dep/curl-7.34.0/lib -L../../dep/openssl-1.0.1g/lib -lhttp -lcurl -lcrypto -lssl -lrt -lz -ldl
../../dep/openssl-1.0.1g/lib/libssl.a(s3_clnt.o): In function `ssl3_check_cert_and_algorithm':
s3_clnt.c:(.text+0x313): undefined reference to `X509_certificate_type'
../../dep/openssl-1.0.1g/lib/libssl.a(s3_enc.o): In function `ssl3_change_cipher_state':
s3_enc.c:(.text+0xc30): undefined reference to `COMP_CTX_free'
s3_enc.c:(.text+0xc4d): undefined reference to `COMP_CTX_new'
s3_enc.c:(.text+0xced): undefined reference to `COMP_CTX_free'
s3_enc.c:(.text+0xd06): undefined reference to `COMP_CTX_new'

网上 这篇文章给出了解决方法,但是并没有给出原因,其实就是库的依赖问题(ssl依赖crypt的方法),仔细看OpenSSL的配置文件已经给出了正确的使用的方法。

I have solved the problem. The solution is simple, for some reason, when linking the library, -lssl must be in front of -lcrypto. This does not happen with the libraries provided by Ubuntu. I wonder why.... If anyone can shed some light on this, I would greatly appreciate it. But anyway, I solved the main issue. Hope this helps others like me.


Demo和Makefile可以参考GitHub上的代码。

https://github.com/gerryyang/wcdj/tree/master/src/demo/http



这个错误信息表明,在链接阶段,程序找不到 OpenSSL 库中 `SSL_CTX_set_next_proto_select_cb` 函数的定义。这通常是由于以下几个原因之一: ### 可能的原因及解决办法 1. **缺少正确的 OpenSSL 版本** - 错误提示明确指出该函数需要支持 OpenSSl 1.1.0 或更高版本。如果你使用的系统自带的是旧版 OpenSSL(如 1.0.x),那么你需要升级到兼容的版本。 - 解决方案:安装更新版本的 OpenSSL,并确保编译时指向了新的库路径。 2. **未正确链接 OpenSSL 库** - 如果你在编译命令中忘记显式指定 `-lssl` 和 `-lcrypto` 参数,就会导致链接失败。 - 确保你的编译选项包含类似下面的内容: ```bash gcc your_program.c -o output_file -lssl -lcrypto ``` 3. **动态链接库的问题** - 当前系统的动态链接器可能无法找到新版本的 OpenSSL 库文件 (`libssl.so`)。 - 检查环境变量 `LD_LIBRARY_PATH` 是否包含了新版 OpenSSL 的目录;如果没设置,则添加它并重新加载配置: ```bash export LD_LIBRARY_PATH=/path/to/new/openssl:$LD_LIBRARY_PATH ldconfig ``` 4. **头文件与实际运行库不匹配** - 即使你引用了最新的 OpenSSL 开发包 (dev 包含 .h 文件),但系统上仍然存在较老的实际运行库 (.so) 被优先使用。 - 使用工具检查依赖链路是否准确无误: ```bash ldd ./your_executable | grep ssl ``` --- ### 具体操作示例 假设你需要安装最新版本 OpenSSL 并修复上述问题,可以按照以下步骤执行: #### 步骤一:下载和解压源码 ```bash wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar xzvf openssl-1.1.1t.tar.gz cd openssl-1.1.1t ``` #### 步骤二:编译并安装 ```bash ./config --prefix=/usr/local/openssl shared zlib make && make test && sudo make install ``` #### 步骤三:调整动态链接器缓存 ```bash echo "/usr/local/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl-1.1.1.conf > /dev/null sudo ldconfig export PATH="/usr/local/openssl/bin:$PATH" ``` 完成之后再尝试重新构建项目即可消除此错误。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值