【问题标题】:Error when compiling file | collect2: error: ld returned 1 exit status编译文件时出错 | collect2:错误:ld 返回 1 个退出状态
【发布时间】:2016-02-18 22:26:48
【问题描述】:

我有很多问题,似乎无法理解发生了什么。我正在尝试从Learn C The Hard Way 学习C,并且我正在尝试编译first exercise。当我运行 make 时,我遇到了一个大问题

cc     ex1.c   -o ex1

ex1.c: In function ‘main’:

ex1.c:3:5: warning: implicit declaration of function ‘put’ [-Wimplicit-function-declaration]

     put("Hello world.");
     ^

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/5.3.1/../../../libc.so when searching for -lc

/usr/bin/ld: skipping incompatible /lib/libc.so when searching for -lc

/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc

/usr/bin/ld: cannot find -lc

collect2: error: ld returned 1 exit status

<builtin>: recipe for target 'ex1' failed


make: *** [ex1] Error 1

任何帮助都会很棒

【问题讨论】:

  • put() --> puts().
  • 隐式声明警告意味着编译器在任何地方都找不到名为“put”的函数,并会尝试为您补上一个。这通常很糟糕,因为它构成的几乎永远不会正确。有时您只是输入了错误的名称,就像您的情况一样。正如其他人提到的,您输入的是“put”而不是“puts”。
  • @bruceg :即便如此,如果你看一下c.learncodethehardway.org/book/ex1.html 的练习,你可以看到作者故意省略了stdio.h 头文件来强制这个警告。我认为这种教学方式没有多大意义——尤其是因为他没有继续解释如何解决它,或者它为什么重要。
  • "/usr/bin/ld: 在搜索 -lc 时跳过不兼容的 /lib/libc.so" - 这是非常不寻常的并且可能是一个主要问题。

标签: c linux gcc makefile


【解决方案1】:

第一个错误很明显;没有声明名为put() 的函数。这是因为

  • 你打错了函数名,
  • 或者因为您未能通过包含声明的头文件直接提供声明。

在这种情况下,如果您尝试编译的代码来自 this exercise,那么请再次查看它 - 它显然与您的代码不同(即上面列出的第一种可能性)。但是即使那样你也会得到同样的错误;进一步阅读练习,你会发现作者故意省略了头文件,以说明对特定库头文件的需要。在没有建议的-Wall 命令行选项的情况下收到警告的原因可能是因为您使用的编译器版本比作者更新。老实说,根据我对“Learn C the Hard Way”的了解,我会避开它。

第二个问题是您的链接器无法找到适当版本的标准 C 库来链接到您的代码。在 Linux 中编译 C 代码通常很简单。大多数发行版都带有已经正确安装和工作的 GCC;你的似乎被严重破坏了。您可能想要修复您的工具链安装。您可能安装了多个不兼容的工具链。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多