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

标签 c++ c linux gcc

我在 /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/

相关文章:

C++ - 迭代元组和类型解析与常量参数

c++ - 学习C++或C

c++ - 在 Qt 控制台场景中未调用析构函数

c - 数组直方图主

c - libjpeg 输出缩放

c - 将时间戳格式化为文本

c++ - 类模板中的好友成员函数定义

c - GTK 默认文件->退出行为

c - 在 linux 中运行特定的 c 文件

c - 如何从 struct addrinfo 获取我自己的 IP 地址