【问题标题】:C Makefile error: ld returned 1 exitC Makefile 错误:ld 返回 1 退出
【发布时间】:2017-03-30 00:54:51
【问题描述】:

我的老师不擅长解释 C,所以我在理解 makefile 的连接时遇到了一些麻烦。我已经添加了 complex.c、complex.h 和 main.c 的代码。我只是在使用 make 命令编译它时遇到了麻烦。我按照他提交的 powerpoint 上的示例进行操作,但我不明白为什么它没有变得复杂。

制作文件

complex: main.o complex.o
    gcc -o complex main.o complex.o
main.o: main.c complex.h
    gcc -c main.c -lm
complex.o: complex.c complex.h
    gcc -c complex.c -lm
clean:
    rm*.o complex
    ls

main.o

main.o: complex.h
    gcc -c main.c

复杂的.o

complex.o: complex.h
    gcc -c complex.c

错误

mason% make
gcc -o complex main.o complex.o 
ld: fatal: file main.o: unknown file type
ld: fatal: file processing errors. No output written to complex
collect2: error: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `complex'

【问题讨论】:

  • gcc 不会将main.o 识别为目标文件似乎很奇怪。您在什么环境(操作系统等)上运行它?
  • @Dolda2000 我用的是mac
  • 您应该每次都运行make clean。看起来 main.o 存在,但系统错误或已损坏(或不正确)。
  • 我认为这实际上并不重要,但您应该将库参数(即-lm,即)提供给生成可执行文件的命令,而不是生成目标文件的命令.只是为了排除它,请纠正它,看看它是否有所作为。还有@SteveHarris 所说的。
  • @struggling: -lm 确实可以让您使用math.h 中的函数,但我的意思是它必须继续执行生成最终可执行文件的命令(其中缺少你的makefile),而不是产生目标文件的命令(你的makefile有它)。

标签: c makefile compiler-errors


【解决方案1】:

看起来您已将 Makefile 片段放入 main.ocomplex.o 中。这些应该由编译器生成,而不是由您生成

删除这些文件,然后再次make

此外,您的 make clean 规则缺少一个空格。

clean:
    rm *.o complex
    ls

还有一件事。编译行中不需要-lm

main.o: main.c complex.h
    gcc -c main.c
complex.o: complex.c complex.h
    gcc -c complex.c

您应该在链接阶段添加-lm

complex: main.o complex.o
    gcc -o complex main.o complex.o -lm

【讨论】:

  • 我想有一个最终的可执行“复杂”,这取决于将 main.o 和 complex.o 链接在一起。我的教授还说我必须在 makefile 中使用 -lm 以便编译器识别 #include .
  • @struggling,您在实际构建 complex 时处于链接阶段的 -lm
  • 我做了所有的事情,但我不知道为什么我仍然得到同样的错误。
【解决方案2】:

“Makefile”定义和控制构建依赖项。

例如,如果不先构建随附的二进制对象/模块文件,就无法构建主要的可执行二进制文件。在这种情况下,它们是 main.ocomplex.o

通常,您需要的任何目标文件也需要一个规则(尽管有些规则可以使用“通配符”来构建更多)。

这都是相当学术的。最好接受错误并尝试反驳它们(这基本上是说 main.o 存在并且是不正确的)。在这种情况下,main.o 存在的假设得到了运行 make 命令时它没有编译的事实的支持。

在您了解更多信息之前,您可以使用“targets”调用“make”。喜欢:make cleanmake complex。它可能有助于清晰。

许多 makefile 都设置了一个“全部”目标来重置构建。然后,这取决于“干净”以及可执行文件和库目标。喜欢:

all: clean complex

然后你“全力以赴”清理和构建。

这里有一个很好的教程。 Mrbook Makefile Tutorial

【讨论】:

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