2017-10-09 44 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化妝教程」快速搜索可以支付股息...

約翰