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

标签 c gcc compiler-construction

我正在阅读 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 仍在运行。

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

最佳答案

来自您对我评论的回复:

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 的结果与您之前得到的结果进行比较。

关于C 程序与共享库链接而不设置 LD_LIBRARY_PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385331/

相关文章:

c - 它是如何工作的 : a specific while-loop

c - 数学指数函数的Python源代码?

java - 为什么守护进程最经常用C编写?

c++ - #include <文件名> 和 #include "filename"有什么区别?

c++ - 内联静态数据导致节类型冲突

c++ - 如何验证 LLVM "ret"指令是否返回无效?

gcc - 为什么 gcc 需要 gmp?

c++ - 是否有用于检测 C++11x 支持的预处理器指令?

c - C 中的伪随机数生成器 - 使用时间函数播种

gcc - 可以在没有自由的情况下构建 binutils 吗?或者report_times可以禁用吗?