2017-10-09 69 views
-4

我在C班有一个任务,我们的老师和整个安排非常糟糕。我们还没有教过任何关于makefile的知识,现在我们应该编译和使用md5实现来完成这个任务,但是我们从未学过如何去做。我已经阅读了关于makefile的很多内容,但我似乎仍然无法使这一个工作。Makefile问题

我有以下文件:

  • md5.c
  • md5.h
  • md5_example.c
  • md5_test.c
  • print_md5.c

这是我的makefile:

CC=gcc 
CFLAGS = -g -O0 

1: md5_example.o 
$(CC) -o md5_example $(CFLAGS) md5_example.o 

2: md5.o 
    $(CC) -o md5 $(CFLAGS) md5.o 

3: md5_test.o 
    $(CC) -o md5_test $(CFLAGS) md5_test.o 

4: print_md5.o 
    $(CC) -o print_md5 $(CFLAGS) print_md5.o 

clean: 
    rm -f *.o md5 md5_example md5_test print_md5 

我得到的错误是:

md5_example.c:2:17: fatal error: md5.h: No such file or directory 

有人可以帮我想出如何我可以编译这些文件一起?

+3

是否md5.h和md5_example.c在同一个目录?这个目录中的makefile也是?你在那里跑步吗? – itdoesntwork

+1

请解释一下你的想法'1:','2:'等等在你的Makefile中的含义。到目前为止,您似乎不了解在makefile中使用'X:Y'。 – Arkadiy

+0

您应该为与生成的文件名称匹配的目标指定名称。也就是说,使用'md5_example:md5_example.o'而不是'1:md5_example.o'等。然后你应该在[隐式规则](https://www.gnu.org/software/make/manual/html_node /Implicit-Rules.html);几乎整个Makefile都可以自动处理。 –

回答

0

嗯,我通过启动1台词有点糊涂了:等等,我希望看到:

md5_example: md5_example.o 

这且不说,您是通过创建从md5_example.cmd5_example.o隐式(内置)规则很好。问题在于汇编;你确定md5_example.c包含:

#include "md5.h" 

而不是这个?

#include <md5.h> 

但是它会更好,有md5_example.o一个明确的条目,其中包括md5.h作为一个依赖。你可以简单的写:

md5_example: md5_example.c md5.h 
    $(CC) -o md5_example $(CFLAGS) md5_example.c 
+0

请注意,您应该用4个空格缩进'code'以获得我展示的结果。或者在编辑框中选择它并使用框上方的**按钮来缩进它。 –

+0

在你的最后一行命令中,程序可能需要链接中的'md5.o'。你也不需要指定'md5_example.c'作为显式依赖(尽管这样做不会造成任何损害),因为'make'可以推断出正确的依赖关系。 –

+0

我将更改为“md5.h”,但现在我得到了; make gcc -o md5 -g -O0 md5.o /usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o:In function '_start': (.text + 0x20):未定义的参考'主' – nazrodim

-1

的方式通过测试,并值得,是学习你要去哪里错了,如何解决它:-)

的误差几乎什么说:你的C文件不包含main()函数。

你的makefile好像有很多可能的目标,你是否真的希望编译和链接所有的.C文件?对于“GNU化妆教程”快速搜索可以支付股息...

约翰