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

最佳答案

-lsqlite3 参数应该放在最后。 g++ 的参数顺序很重要。您应该阅读有关运行路径的更多信息,并可能通过 -Wl,-rpath,/somepath/.libs
您可能希望将 -v 一次传递给 g++ 以了解正在发生的事情(实际运行的是哪些程序)。您也可以通过 -Wl,--verbose 来询问更详细的链接。

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

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

关于c++ - 我怎样才能告诉 GCC 使用自定义库 -l 而不是系统库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41303527/

10-11 19:19