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

时间:2025-01-23 07:53:49

在网上找了一个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 知道了所依赖的openssl 库文件,然后全局搜索了系统中的所有 和 文件,再通过 nm 指令,来各个验证是否这个so包含了那些报错的函数,然后把包含这些函数和不包含这些函数的so文件分开,发现不包含报错函数的so位于/usr/lib64目录下。

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

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

最后用cmake再次编译即可!

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