C Makefile 错误:ld 返回 1 exit

问题描述 投票:0回答:3

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

生成文件

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'
c makefile compiler-errors
3个回答
3
投票

看起来您已将 Makefile 片段放入

main.o
complex.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



0
投票

例如,如果不首先构建与其配套的二进制对象/模块文件,则无法构建主要的可执行二进制文件。在本例中,它们是

main.o

complex.o

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

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

在您了解更多信息之前,您可以使用“targets”调用“make”。比如:

make clean

make complex
。它可能有助于澄清。

许多 makefile 放置了一个“all”目标来重置构建。这取决于“干净”以及可执行文件和库目标。喜欢:

all: clean complex

然后你“全部”进行清理和构建。

这里有一个很好的教程。

Mrbook Makefile 教程


0
投票
VOID

)。我不知道发生这种情况的真正原因,但这是一个对我有用的实用解决方案! 注意:我还摆脱了我使用过的

SWITCH

并求助于 if , else if , else ,这可能是一个更合理的解释

© www.soinside.com 2019 - 2024. All rights reserved.