itisamos 2024-01-09 10:27 采纳率: 100%
浏览 1
已结题

linux下sqlite共享库编译问题

Centos 下c++ 编译程序时包含sqlite3的错误:
[root@centos dscluster]# make dscluster
g++ -g -o dscluster dscluster.cpp -L/app/dscluster -ldspublic -L/app/dscluster -lrdbrelative -std=c++11
/usr/bin/ld: /tmp/cce8fLra.o: undefined reference to symbol 'sqlite3_open'
/usr/local/lib/libsqlite3.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [dscluster] Error 1

前面的librdbrelative.so编译没有错误。

[root@centos dscluster]# ldd librdbrelative.so
        linux-vdso.so.1 =>  (0x00007ffc974e4000)
        libsqlite3.so.0 => /usr/local/lib/libsqlite3.so.0 (0x00007f46b5215000)
        libmysqlclient.so.21 => /usr/lib64/libmysqlclient.so.21 (0x00007f46b4b0a000)
        libocci.so.11.1 => /app/oracle/product/11.2.0/db_1/lib/libocci.so.11.1 (0x00007f46b47b2000)
        libclntsh.so.11.1 => /app/oracle/product/11.2.0/db_1/lib/libclntsh.so.11.1 (0x00007f46b1d48000)
        libnnz11.so => /app/oracle/product/11.2.0/db_1/lib/libnnz11.so (0x00007f46b197b000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f46b15ae000)

    ......

centos自带sqlite 3.7,其共享库位于/usr/lib64. 而我通过下载安装了sqlite 3.44.2,位于 libsqlite3.so.0 => /usr/local/lib/libsqlite3.so.0 (0x00007f46b5215000)。是什么问题呢?gcc 4.8.5 版本太低了?两个版本sqlite3冲突?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-01-09 10:28
    关注

    引自免费微信小程序:皆我百晓生

    这个问题是由于在编译程序时缺少对SQLite共享库的链接导致的。

    为了解决这个问题,您可以尝试以下解决方案:

    1. 修改编译命令: 在编译命令中,添加对libsqlite3的链接选项。修改Makefile或者编译脚本中的g++编译命令,如下所示:

    g++ -g -o dscluster dscluster.cpp -L/app/dscluster -ldspublic -L/app/dscluster -lrdbrelative -lsqlite3 -std=c++11
    

    这里添加了一个-lsqlite3选项来链接libsqlite3共享库。

    2. 调整链接顺序: 有时候,调整共享库链接的顺序也可以解决该问题。在编译命令中,将-lsqlite3选项移动到最后,如下所示:

    g++ -g -o dscluster dscluster.cpp -L/app/dscluster -ldspublic -L/app/dscluster -lrdbrelative -std=c++11 -lsqlite3
    

    这样做可以确保链接顺序的正确性,因为在Linux中,共享库之间的依赖关系可能会导致符号未定义的错误。

    3. 确保库文件可访问: 确保您的sqlite3库文件libsqlite3.so.0位于/usr/local/lib/libsqlite3.so.0路径下,并且具有正确的权限。您可以通过运行ls -l /usr/local/lib/libsqlite3.so.0命令来检查文件的权限和路径。

    如果库文件不在该路径下,请将正确路径添加到Makefile或者编译脚本中。

    4. 确定动态库路径: 如果您的共享库libsqlite3.so.0位于非系统默认的路径下,您可能需要将库的路径添加到动态库加载器的搜索路径中。可以通过以下步骤实现:

    • 创建一个文件/etc/ld.so.conf.d/sqlite3.conf
    • 在该文件中添加库的路径,例如/usr/local/lib
    • 运行命令sudo ldconfig来更新动态库缓存。

    在运行您的程序之前,请确保已经添加了新的动态库路径。

    希望以上解决方案可以帮助您解决问题。如果问题仍然存在,请提供更多信息,比如编译器版本以及编译过程中的任何警告或错误消息,这样可以更好地帮助您解决问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 1月17日
  • 已采纳回答 1月9日
  • 创建了问题 1月9日

悬赏问题

  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)