centos 编译 rabbitmq-c 遇到 undefined reference to OPENSSL_init_ssl, BIO_meth_set_read 等报错的解决

博主在编译rabbitmq-c时遇到报错,提示openssl相关函数未定义。经分析,是openssl版本升级后部分函数不兼容,cmake默认找了旧版本so库。通过相关指令找到最新openssl文件路径,验证so文件,最终用cmake指定正确的openssl目录再次编译解决问题。

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

在网上找了一个rabbitmq-c-0.8.0(rabbitmq-c-0.9.0 也可以) 的版本,编译到amqp_bind的时候报错了,提示 undefined reference to  OPENSSL_init_ssl, BIO_meth_set_read 等函数找不到定义,看名字大概猜测这些函数是和openssl相关的,然后网上google了半天,重装openssl什么的都试过了,没有奏效。

但是看了很多帖子,还是大概了解到了出错原因,说白了是很简单,其实就是openssl版本升级后部分函数不兼容,而我的机器上除了yum安装的openssl外还有系统本身也带有一个1.0.1e的版本,这样rabbitmq-c去编译的时候cmake默认找了1.0.1e版本的so库,而rabbitmq-c上用到的已经是新的openssl接口了,这样就导致了函数未定义。我是怎么发现的呢?要用到以下两个指令:

查看文件中的符号信息:
nm -D xxxxx | grep xxxxx

列出一个程序所需要的动态链接库(so)
ldd xxxx

首先通过openssl version -a,找到最新的openssl相关文件路径:

OPENSSLDIR: "/usr/local/openssl/ssl"
ENGINESDIR: "/usr/local/openssl/lib/engines-1.1"

这就是最新的正确的openssl文件路径。

通过 ldd librabbitmq.so 知道了所依赖的openssl 库文件,然后全局搜索了系统中的所有 libcrypto.so 和 libssl.so文件,再通过 nm 指令,来各个验证是否这个so包含了那些报错的函数,然后把包含这些函数和不包含这些函数的so文件分开,发现不包含报错函数的so位于/usr/lib64目录下。

然后去 rabbitmq-c-0.8.0的build目录下的CMakeCache.txt去查找编译用到的libcrypto.so和libssl.so到底是哪个目录的。发现果然是链接了不包含新函数的so库,最后解决的方法就比较简单,用cmake输入以下指令:

  • -DOPENSSL_INCLUDE_DIR:指向 正确openssl  的 include 目录
  • -DOPENSSL_SSL_LIBRARIE:指向 正确openssl 的 lib 目录中的 libssl.so
  • -DOPENSSL_CRYPTO_LIBRARIE:指向 正确openssl 的 lib 目录中的 libcrypto.so

最后用cmake再次编译即可!

这个问题的解决还是花了不少时间,翻了很多帖子(老外的技术贴都很认真,很值得我们学习),所以细节有点忘了,尽管开始很没头绪,但最终问题的解决还是要自己静下来理一下思路,带着这个思路去找到一些有用的指令,从而解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值