C 程序链接共享库而不设置 LD_LIBRARY_PATH

问题描述 投票:0回答:1

我正在阅读 GCC 简介,它说一个包是否同时包含 .a 和 .so。 gcc 更喜欢共享库。默认情况下,加载程序仅在一组预定义的系统目录中搜索共享库,例如

/usr/local/lib
/usr/lib
。如果库不位于这些目录之一,则必须将其添加到加载路径,或者您需要使用
-static
选项强制它使用 .a 库。但是,我尝试了以下方法:

vim 你好.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

它运行了。书上说应该有如下错误:

./a.out: error while loading shared libraries:
libgdbm.so.3: cannot open shared object file:
No such file or directory

(好吧,这本书使用了GDBM作为示例,但我使用了GMP,但这并不重要,对吧?)

但是,我没有设置

LD_LIBRARY_PATH=/opt/lib
,正如你所看到的,我也没有使用
-static
选项,但
a.out
仍然运行。

你们能告诉我原因并告诉我如何得到书中描述的错误吗?是的,我想要错误,这样我就会明白我误解了什么。

c gcc
1个回答
3
投票

从您对我的评论的回复:

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
中的库,然后链接到新名称。

mv /opt/lib/libgmp.so /opt/lib/libgmp-test.so
gcc hello.c -I/opt/include -L/opt/lib -lgmp-test

然后尝试运行该程序。另外,将

ldd
与新
a.out
的结果与您之前得到的结果进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.