前言:
现时我们对“查看openssl路径”大约比较注重,我们都需要分析一些“查看openssl路径”的相关资讯。那么小编也在网络上收集了一些关于“查看openssl路径””的相关资讯,希望小伙伴们能喜欢,我们一起来了解一下吧!在 Ubuntu 中编译 SQLCipher libsqlcipher.so: undefined reference to `OPENSSL_init_crypto'原因及解决方案。
一、在 Ubuntu 中编译 SQLCipher,但是当我运行 make 命令时出现此错误:
./.libs/libsqlcipher.so: undefined reference to `OPENSSL_init_crypto'
./.libs/libsqlcipher.so: undefined reference to `HMAC_CTX_new'
./.libs/libsqlcipher.so: undefined reference to `HMAC_CTX_free'
collect2: error: ld returned 1 exit status
Makefile:611: set di istruzioni per l'obiettivo "sqlcipher" non riuscito
make: *** [sqlcipher] Errore 1
二、出现该问题的原因:
根源在于,SQLite 本身是支持加密功能的 (免费版本不提供加密功能,商业版本是支持加密模块)。SQLCipher 是一个开源的 SQLite 加密的扩展,支持对 db 文件进行 256位的 AES 加密。
加密库用的是openssl,自 OpenSSL 3.0 起,以下函数已被弃用,并且可以通过使用合适的版本值定义OPENSSL_API_COMPAT来完全隐藏,请参阅openssl_user_macros(7):
const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx);
自 OpenSSL 1.1.0 起,以下函数已被弃用,并且可以通过使用合适的版本值定义OPENSSL_API_COMPAT来完全隐藏,请参阅openssl_user_macros(7):
int EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx);SQLCipher需要的系统的openssl里没有需要的函数,因为版本的问题。
三、解决方法思路
该问题起因是openssl版本的问题;
1、下边命令查看libsqlcipher.so调用的openssl路径
Ldd –r /usr/lib/aarch64-linux-gnu/libsqlcipher.so
运行结果
ldd -r /usr/lib/x86_64-linux-gnu/libsqlcipher.so
linux-vdso.so.1 (0x00007ffe7dac9000)
libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f7e5b9ed000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7e5b9ca000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7e5b9c4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7e5b7d2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7e5bdaa000)
2、运行openssl version,查看版本
$ openssl version
OpenSSL 1.1.1f 31 Mar 2020
3、查看libcrypto.so是否有提示找不到的函数
运行strings /lib/x86_64-linux-gnu/libcrypto.so.1.1 | grep OPENSSL_init_crypto
~$ strings /lib/x86_64-linux-gnu/libcrypto.so.1.1 | grep OPENSSL_init_crypto
OPENSSL_init_crypto
OPENSSL_init_crypto
这种运行结果,说明libcrypto.so里有,编译找不的接口;找不的原因是so库连接路径不对;编译参数那加上库的路径 /lib/x86_64-linux-gnu/libcrypto.so 。
运行如果结果没有OPENSSL_init_crypto显示,说明openssl版本不对;需要下载openssl对应的版本;源码编译安装。
总结:
在linux 中编译遇到 undefined reference to `XXX'原因有两种
一种是so库的版本不对;
一种是so库的版本较多,连接的版本没有这个接口;说明openssl版本不对;需要下载openssl对应的版本;源码编译安装。
这样就可以解决undefined reference to `XXX'问题。
标签: #查看openssl路径