Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序与共享库链接而不设置LD_library_路径_C_Gcc_Compiler Construction - Fatal编程技术网

C程序与共享库链接而不设置LD_library_路径

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;

我在读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
(这本书以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