C程序与共享库链接而不设置LD_library_路径
我在读GCC的介绍,它说如果一个包同时有.a和.so。gcc更喜欢共享库。默认情况下,加载程序仅在一组预定义的系统目录中搜索共享库,例如C程序与共享库链接而不设置LD_library_路径,c,gcc,compiler-construction,C,Gcc,Compiler Construction,我在读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;
/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
(这本书以GDBM为例,但我使用了GMP,但这并不重要,对吗?)
但是,我没有设置LD\u LIBRARY\u 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)
因此,您的程序正在从/usr/lib
中提取库
您可以尝试重命名/opt/lib
中的lib,并根据新名称进行链接
mv /opt/lib/libgmp.so /opt/lib/libgmp-test.so
gcc hello.c -I/opt/include -L/opt/lib -lgmp-test
然后试着运行这个程序。另外,将
ldd
的结果与新的a.out
的结果与之前的结果进行比较。您是否100%确定/usr/lib
中没有libgmp
?另外,确保/etc/ld.so.conf
中没有/opt/lib
的条目。此外,确保没有为您设置ld\u库路径。使用LD\u LIBRARY\u PATH=
(在=
之后没有任何内容)将其取消设置。我使用echo LD\u LIBRARY\u PATH验证它是否已为空。非常感谢。此外,我以前确实在/usr/local下安装了库(作为学习的一种方式),但我已经将它们全部删除,并再次安装到/opt/。感谢大家的帮助a.out
上的ldd
的输出是什么样子的?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)谢谢。。非常感谢。但是您能告诉我如何让它从/opt/而不是/usr/lib获取库吗?这让我很困惑,因为在GMP文档中,它说如果你“makeinstall”,它将被安装到/usr/local/lib,但是我做了“makeinstall-prefix=/opt”,现在它从/usr/lib获取库……我将它重命名为libgmpt.so,然后我做了“gcc hello.c-I/opt/include-L/opt/lib-lgmpt”。但是它仍然从/usr/lib/中获取信息,并且a.out仍然没有错误地运行。我想我已经花了太多时间试图理解这一点了。我不知道。也许我应该继续读下去,把它放在一边?@ZesenHuang:a.out上的ldd
现在说了什么?我已经试过gmp\u randinit\u default和gmp\u randseed\u ui了。同样的故事。非常感谢您的支持help@ZesenHuang:谢谢你接受我的回答,对你的问题回答+1。
mv /opt/lib/libgmp.so /opt/lib/libgmp-test.so
gcc hello.c -I/opt/include -L/opt/lib -lgmp-test