为什么有些图书馆无法打开?

时间:2017-03-25 12:02:03

标签: gcc linker shared-libraries libraries ld

我写了一个简单的C程序,prova.c
gcc -Wall -m32 -stdc=99 -c prova.c -o prova.o
我想查看链接到它的库,所以:

  • 我用gcc -m32 -Wl,--verbose prova.o -o prova
  • 编译了它
  • 我将其链接attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib32/crt1.o succeeded /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib32/crt1.o attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib32/crti.o succeeded /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib32/crti.o attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/32/crtbegin.o succeeded /usr/lib/gcc/x86_64-linux-gnu/4.8/32/crtbegin.o attempt to open prova.o succeeded prova.o attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc.so failed attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc.a succeeded attempt to open /usr/lib/gcc/x86_64-linux-gnu/4.8/32/libgcc_s.so succeeded

现在,当我检查我的标准输出时,我注意到一些图书馆无法打开 为什么会这样?为什么他们试图打开?为什么会失败?

{{1}}

1 个答案:

答案 0 :(得分:2)

您的编译命令后缀为-lgcc -lc,由编译器驱动程序添加。此标志不会准确地告诉链接器libgcc和libc的位置,也不指定它们应该是静态的还是共享的。因此,链接器会反复尝试在各种目录中找到它们(通过-L或链接器脚本从编译器传递)。默认情况下,链接器首先尝试链接库的共享版本(.so),然后链接静态版本(.a)。

您看到attempt to open ... failed的警告不是真正的失败,而是关于链接器在搜索所需库中的进展的诊断消息。