我在 /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++
的参数顺序很重要。您应该阅读有关 runpath 的更多信息,也许可以通过 -Wl,-rpath,/somepath/.libs
您可能希望将 -v
传递给 g++
以了解正在发生的事情(实际运行的程序)。您也可以传递 -Wl,--verbose
来询问更详细的链接。
然后您可以在您的可执行文件(以及 readelf
)上使用 ldd
来了解更多它的链接时间依赖性。
有了 g++
的合适参数,您就不需要 gdb
的附加选项了
关于c++ - 我如何告诉 GCC 为 -l 使用自定义库而不是系统库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41303527/