百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

在 Ubuntu 中编译 so: undefined reference to `OPENSSL_init_crypto'

bigegpt 2024-08-10 12:05 5 浏览

在 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'问题。

相关推荐

10w qps缓存数据库——Redis(redis缓存调优)

一、Redis数据库介绍:Redis:非关系型缓存数据库nosql:非关系型数据库没有表,没有表与表之间的关系,更不存在外键存储数据的形式为key:values的形式c语言写的服务(监听端口),用来存...

Redis系列专题4--Redis配置参数详解

本文基于windowsX64,3.2.100版本讲解,不同版本默认配置参数不同在Redis中,Redis的根目录中有一个配置文件(redis.conf,windows下为redis.windows....

开源一夏 | 23 张图,4500 字从入门到精通解释 Redis

redis是目前出场率最高的NoSQL数据库,同时也是一个开源的数据结构存储系统,在缓存、数据库、消息处理等场景使用的非常多,本文瑞哥就带着大家用一篇文章入门这个强大的开源数据库——Redis。...

redis的简单与集群搭建(redis建立集群)

Redis是什么?是开源免费用c语言编写的单线程高性能的(key-value形式)内存数据库,基于内存运行并支持持久化的nosql数据库作用主要用来做缓存,单不仅仅是做缓存,比如:redis的计数器生...

推荐几个好用Redis图形化客户端工具

RedisPlushttps://gitee.com/MaxBill/RedisPlusRedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows、Linux...

关于Redis在windows上运行及fork函数问题

Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成。微软的一些工程师花费时间在解决在...

你必须懂的Redis十大应用场景(redis常见应用场景)

Redis作为一款高性能的键值存储数据库,在互联网业务中有着广泛的应用。今天,我们就来详细盘点一下Redis的十大常用业务场景,并附上Golang的示例代码和简图,帮助大家更好地理解和应用Redis。...

极简Redis配置(redis的配置)

一、概述Redis的配置文件位于Redis安装目录下,文件名为redis.conf(Windows名为redis.windows.conf,linux下的是redis.conf)你可以通过C...

什么是redis,怎么启动及如何压测

从今天起咱们一起来学习一下关于“redis监控与调优”的内容。一、Redis介绍Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。...

一款全新Redis UI可视化管理工具,支持WebUI和桌面——P3X Redis UI

介绍P3XRedisUI这是一个非常实用的RedisGUI,提供响应式WebUI访问或作为桌面应用程序使用,桌面端是跨平台的,而且完美支持中文界面。Githubhttps://github....

windows系统的服务器快速部署java项目环境地址

1、mysql:https://dev.mysql.com/downloads/mysql/(msi安装包)2、redis:https://github.com/tporadowski/redis/r...

window11 下 redis 下载与安装(windows安装redis客户端)

#热爱编程是一种怎样的体验#window11下redis下载与安装1)各个版本redis下载(windows)https://github.com/MicrosoftArchive/r...

一款轻量级的Redis客户端工具,贼好用!

使用命令行来操作Redis是一件非常麻烦的事情,我们一般会选用客户端工具来操作Redis。今天给大家分享一款好用的Redis客户端工具TinyRDM,它的界面清新又优雅,希望对大家有所帮助!简介Ti...

一个.NET开发且功能强大的Windows远程控制系统

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍SiMayRemoteMonitorOS是一个基于Windows的远程控制系统,完...

Redis客户端工具详解(4款主流工具)

大家好,我是mikechen。Redis是大型架构的基石,也是大厂最爱考察内容,今天就给大家重点详解4款Redis工具@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集...