SQLite3库链接与加载问题解决方案

orangepi@orangepizero2:~/embedded_Database/sqlite ls /usr/local/lib/ libsqlite3.a libsqlite3.so.0 libwiringPiDev.so libwiringPi.so pkgconfig python3.6 libsqlite3.so libsqlite3.so.3.50.4 libwiringPiDev.so.2.58 libwiringPi.so.2.58 python2.7 orangepi@orangepizero2:\~/embedded_Database/sqlite orangepi@orangepizero2:~/embedded_Database/sqlite orangepi@orangepizero2:\~/embedded_Database/sqlite gcc openSqlite.c -lsqlite3 orangepi@orangepizero2:~/embedded_Database/sqlite ./a.out ./a.out: error while loading shared libraries: libsqlite3.so: cannot open shared object file: No such file or directory orangepi@orangepizero2:\~/embedded_Database/sqlite

输出可以看到,libsqlite3.so 确实存在于 /usr/local/lib/,但运行时仍然找不到。这是因为 Linux 默认不会自动搜索 /usr/local/lib/ 下的共享库(.so 文件),除非该路径被添加到动态链接器的搜索路径中。

解决方法

cpp 复制代码
方法 1:临时添加 /usr/local/lib/ 到 LD_LIBRARY_PATH(仅当前终端有效)
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
./a.out
这样,程序运行时就会在 /usr/local/lib/ 下查找 libsqlite3.so。

方法 2:永久添加 /usr/local/lib/ 到系统库搜索路径
(推荐)方法 
2.1:更新 /etc/ld.so.conf
    检查 /etc/ld.so.conf 是否包含 /usr/local/lib/:
    cat /etc/ld.so.conf
    如果没有,可以手动添加:
    sudo sh -c "echo '/usr/local/lib' >> /etc/ld.so.conf"
    更新动态链接器的缓存:
    sudo ldconfig
    再次运行程序:
    ./a.out

方法 2.2:
    在 /etc/ld.so.conf.d/ 下创建新配置文件
    echo '/usr/local/lib' | sudo tee /etc/ld.so.conf.d/local_lib.conf
    sudo ldconfig
    ./a.out

方法 3:编译时指定运行时库路径(避免修改系统配置)
    gcc openSqlite.c -lsqlite3 -Wl,-rpath=/usr/local/lib -o a.out
    -Wl,-rpath=/usr/local/lib 告诉链接器在运行时优先从 /usr/local/lib 加载共享库。
    这样即使 LD_LIBRARY_PATH 没有设置,程序也能找到 libsqlite3.so。

方法 4:静态链接 SQLite3(完全避免动态库依赖)
    gcc openSqlite.c /usr/local/lib/libsqlite3.a -o a.out
    这样编译后,a.out 会直接包含 SQLite3 的代码,不再依赖 libsqlite3.so。

为什么会出现这个问题?
    Linux 默认只搜索 /lib 和 /usr/lib,而 /usr/local/lib 通常需要手动配置。
    你的 libsqlite3.so 在 /usr/local/lib/,但动态链接器(ld.so)默认不会搜索这个路径。
    通过 LD_LIBRARY_PATH、ldconfig 或 -rpath 可以解决这个问题。

验证是否解决
    运行:
    ldd ./a.out
    如果输出显示 libsqlite3.so 已经正确找到(而不是 not found),说明问题已解决。

总结
    ✅ 推荐方法:

    临时测试:export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

    永久解决:sudo ldconfig(确保 /usr/local/lib 在 ld.so.conf 里)

    编译时指定路径:gcc ... -Wl,-rpath=/usr/local/lib

这样应该就能让 ./a.out 正常运行了! 🚀
相关推荐
IvorySQL8 小时前
PostgreSQL 日报 | JOIN 与外键优化(8 月 9 日)
数据库·postgresql
ltl8 小时前
自治数据库十年回顾:Peloton、NoisePage、OtterTune 到云原生 auto-tuning
数据库
灯澜忆梦10 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
C++ 老炮儿的技术栈11 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客11 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
zt1985q13 小时前
本地部署开源网络书签与内容管理工具 Karakeep 并实现外部访问
运维·服务器·网络·数据库·网络协议·开源
IvorySQL14 小时前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
油丶酸萝卜别吃14 小时前
MySQL B+ 树查询全过程详解
数据库·mysql
leisoo809714 小时前
股票数据本地化存储实战:JSON、数据库与列式存储的方案对比
jvm·数据库·json
Exclusive_Cat14 小时前
MySQL回表机制解析与优化策略
数据库·sql