如何告诉GCC为-l而不是系统使用自定义库?

时间:2016-12-23 14:49:51

标签: c++ c linux gcc

我在/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中被查找,并且毫不奇怪地缺少自定义构建中添加的函数的符号。我该如何解决这个问题并调试我的代码?

2 个答案:

答案 0 :(得分:6)

-lsqlite3参数应该是最后一个。 g++的参数顺序很重要。您应该阅读有关runpath的更多信息,并且可能会传递-Wl,-rpath,/somepath/.libs

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

然后,您可以在可执行文件(以及ldd)上使用readelf来查找更多链接时间依赖项。

使用g++的合适参数,您不需要其他选项gdb

答案 1 :(得分:2)

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

在gdb内部使用以下命令。

sha1's