为什么有些图书馆打不开?

Gab*_*tti 5 linker gcc shared-libraries ld libraries

我编写了一个简单的 C 程序 prova.c
int main() {return 0;}
我想查看链接到它的库,所以:

  • 我用它编译了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
Run Code Online (Sandbox Code Playgroud)

yug*_*ugr 3

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

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