我在 /somepath
有一个 SQLite3 的自定义版本,所以 /somepath/.libs
包含 libsqlite3.so.0.8.6
和它的符号链接(symbolic link)。我想将一个程序链接到它并假设
g++ -O3 -g -fPIC -I /somepath -I /somepath/src -L /somepath/.libs -lsqlite3 -o myfile.so myfile.cpp
会工作。它可以编译,但由于代码中的某些问题,我遇到了段错误,并且在尝试调试时遇到了类似 LD_PRELOAD not working with my program 和 Setting 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
中查找,并且不出所料地缺少自定义构建中添加的函数的符号。我该如何解决这个问题并调试我的代码? 最佳答案
-lsqlite3
参数应该放在最后。 g++
的参数顺序很重要。您应该阅读有关运行路径的更多信息,并可能通过 -Wl,-rpath,/somepath/.libs
您可能希望将 -v
一次传递给 g++
以了解正在发生的事情(实际运行的是哪些程序)。您也可以通过 -Wl,--verbose
来询问更详细的链接。
然后你可以在你的可执行文件(以及 ldd
)上使用 readelf
来了解更多它的链接时间依赖关系。
使用适当的 g++
参数,您不需要 gdb
的其他选项
关于c++ - 我怎样才能告诉 GCC 使用自定义库 -l 而不是系统库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41303527/