2017-03-30 72 views
0

我的老师不是最好的解释C所以我有点麻烦了解makefile的连接。我已经添加了complex.c,complex.h和main.c的代码。我只是无法使用make命令编译它。我遵循了他传递的powerpoint的例子,我不明白为什么它没有变得复杂。C Makefile错误:ld返回1退出

生成文件

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 

complex.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' 
+0

'gcc'不会将'main.o'识别为目标文件,这似乎很奇怪。你在使用什么环境(OS,&C)? – Dolda2000

+0

@ Dolda2000我正在使用mac – struggling

+0

您应该每次运行'make clean'。它看起来像'main.o'存在,但是是错误的系统或损坏(或不正确)。 –

回答

2

看起来您已将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 
+0

我想有一个最终的可执行文件“复杂”,这取决于将main.o和complex.o链接在一起。我的教授还说我必须在makefile中使用-lm,这样编译器才能识别#include 。 – struggling

+0

@struggling,你在实际构建'complex'时在链接阶段执行'-lm'。 – merlin2011

+0

我做了所有事情,但我不知道为什么我仍然得到相同的错误。 – struggling

0

“Makefile”定义并控制构建依赖关系。

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

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

这完全是学术性的。最好在他们的单词中尝试错误并尝试反驳它们(这个主要说main.o存在并且不正确)。在这种情况下,运行make命令时没有编译的事实支持main.o存在的假设。

在您了解更多信息之前,您可以使用“目标”调用“make”。像:make cleanmake complex。这可能有助于提高清晰度。

很多makefile都将“all”目标设置为重置构建。这取决于“干净”和可执行文件和库目标。像:

all: clean complex 

那么,你“让所有”来清理和建立。

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

相关问题