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

Ale*_*nov 3 c c++ linux gcc

我有一个SQLite3的自定义构建/somepath,所以/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
Run Code Online (Sandbox Code Playgroud)

会工作.它编译,但由于我的代码中的一些问题我得到了分段错误,并且在尝试调试时遇到了看起来像LD_PRELOAD不能使用我的程序的问题设置我的lib for LD_PRELOAD使得一些进程产生加载器错误:I可以运行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,并且毫不奇怪地错过了自定义构建中添加的函数的符号.我该如何解决这个问题并调试我的代码?

Bas*_*tch 6

-lsqlite3参数应该是最后一次.g++重要事项的论点顺序.您应该阅读有关runpath的更多信息并传阅-Wl,-rpath,/somepath/.libs

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

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

有适当的参数,g++你不需要额外的选项gdb