Zes*_*ang 5 c compiler-construction gcc
我正在阅读GCC简介,它说如果一个软件包同时包含.a和.so.gcc更喜欢共享库.默认情况下,加载程序仅在预定义的一组系统目录(例如/usr/local/lib
和)中搜索共享库/usr/lib
.如果库不在其中一个目录中,则必须将其添加到加载路径,或者您需要使用-static
选项强制它使用.a库.但是,我尝试了以下方法:
vim hello.c:
#include <gmp.h>
#include <stdio.h>
int main() {
mpz_t x;
mpz_init(x);
return 0;
}
gcc hello.c -I/opt/include -L/opt/lib -lgmp (my gmp library is in opt)
./a.out
Run Code Online (Sandbox Code Playgroud)
它运行.该书说它应该有以下错误:
./a.out: error while loading shared libraries:
libgdbm.so.3: cannot open shared object file:
No such file or directory
Run Code Online (Sandbox Code Playgroud)
(好吧,这本书以GDBM为例,但我使用的是GMP,但这没关系吗?)
但是,我没有设置LD_LIBRARY_PATH=/opt/lib
,你可以看到我也没有使用-static
选项,但a.out
仍然运行.
你能告诉我为什么,并告诉我如何得到书中描述的错误?是的我想要错误,所以我会理解我误解的内容.
从你对我的评论的回复来看:
linux-gate.so.1 => (0xb7746000)
libgmp.so.10 => /usr/lib/i386-linux-gnu/libgmp.so.10 (0xb76c5000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7520000)
/lib/ld-linux.so.2 (0xb7747000)
Run Code Online (Sandbox Code Playgroud)
因此,您的程序正在从/usr/lib
.
您可以尝试做的是重命名您的库中的库/opt/lib
,然后链接到新名称。
mv /opt/lib/libgmp.so /opt/lib/libgmp-test.so
gcc hello.c -I/opt/include -L/opt/lib -lgmp-test
Run Code Online (Sandbox Code Playgroud)
然后尝试运行该程序。ldd
另外,将新的结果a.out
与之前得到的结果进行比较。