【问题标题】:How can I tell GCC to use custom library for -l instead of the system one?如何告诉 GCC 为 -l 使用自定义库而不是系统库?
【发布时间】:2016-12-23 14:49:50
【问题描述】:

我在/somepath 有一个SQLite3 的自定义构建,所以/somepath/.libs 包含libsqlite3.so.0.8.6 和指向它的符号链接。我想针对它链接一个程序并假设

g++ -O3 -g -fPIC -I /somepath -I /somepath/src -L /somepath/.libs -lsqlite3 -o myfile.so myfile.cpp

会工作的。它可以编译,但是由于我的代码中的一些问题而出现分段错误,并且在尝试调试时遇到了类似于LD_PRELOAD not working with my programSetting my lib for LD_PRELOAD makes some processes produce loader errors 的问题:我可以运行LD_PRELOAD=myfile.so /somepath/sqlite3 ...,但在 GDB 下我得到了符号查找错误和LD_DEBUG=all LD_PRELOAD=myfile.so gdc -c core /somepath/sqlite3 ... 显示符号正在/usr/lib/x86_64-linux-gnu/libsqlite3.so.0 而不是/somepath/libsqlite3.so.0 中查找,并且不出所料地缺少自定义构建中添加的函数的符号。我该如何解决这个问题并调试我的代码?

【问题讨论】:

  • 标题与问题相矛盾。您是在询问如何使 gdb 加载您的库或 gcc 与您的库链接吗?
  • @SergeyA 我认为是 gcc 没有链接到我想要的库,但我可能会误解。

标签: c++ c linux gcc


【解决方案1】:

-lsqlite3 参数应该在最后。 g++ 的参数顺序很重要。你应该阅读更多关于 runpath 的信息,或许可以通过 -Wl,-rpath,/somepath/.libs

您可能希望将-v 传递给g++ 一次以了解正在发生的事情(实际运行的程序)。你也可以通过-Wl,--verbose 来询问更详细的链接。

然后您可以在您的可执行文件(以及readelf)上使用ldd 来了解更多它的链接时间依赖性。

使用g++ 的合适参数,您应该不需要gdb附加 选项

【讨论】:

    【解决方案2】:

    来自http://visualgdb.com/gdbreference/commands/set_solib-search-path

    在 gdb 中使用以下命令。

    set solib-search-path [Directories]
    show solib-search-path
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2011-06-09
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多