【问题标题】:Why some Libraries failed to open?为什么有些库无法打开?
【发布时间】:2017-03-25 12:02:03
【问题描述】:

我写了一个简单的 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

【问题讨论】:

  • "如果没有打开,为什么要链接?"他们不是。当它看到 -lgcc 时,链接器尝试使用 libgcc.so 来满足它,但失败了,所以它接下来尝试 libgcc.a。
  • @MarcGlisse 这应该是一个答案。
  • 您好,感谢您帮助我!我编辑了这个问题,以便更清楚我的意思。我问的问题不清楚。
  • 我想知道为什么链接器试图打开它们,然后为什么它们无法打开?

标签: gcc linker shared-libraries libraries ld


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多