2014-11-03 113 views
-1

我需要創建這些文件生成文件:GCC的makefile與多個* .c文件

  1. 的main.c
  2. ceaser.c
  3. ceaser.h

我試過這個:

all: task1 
task1 : main.o ceaser.o gcc main.o ceaser.o task1.o -o task1 
ceaser.o : ceaser.c ceaser.h gcc -c -g -Wall ceaser.c 
main.o : main.c gcc -c -g -Wall main.c 
clean: rm *.o 
cleanall: rm task1 *.o 

但是當我試圖運行它,它只是一個ys:

make: Nothing to be done for `MakeFile1'. 
+0

請注意,makefile只在需要時執行命令(源時間戳比輸出文件新)。刪除所有的* .o文件和task1文件,並檢查它是否工作。你也有不好的縮進,但我想這只是一個計算器格式化問題 – 2014-11-03 11:33:31

+1

你似乎缺少(至少)你的代碼片段中的幾條新行。 – 2014-11-03 11:35:15

+0

所有其他文件都被刪除,但它仍然會這樣做 – etamar211 2014-11-03 11:35:38

回答

1

對於它是一個適當的生成文件,格式是至關重要的,或者它根本不會工作。

all: task1 

task1 : main.o ceaser.o 
     gcc main.o ceaser.o -o task1 

ceaser.o : ceaser.c ceaser.h 
     gcc -c -g -Wall ceaser.c -o [email protected] 

main.o : main.c 
     gcc -c -g -Wall main.c -o [email protected] 

clean: 
     rm *.o 

cleanall: 
     rm task1 *.o 

還要注意,那些必須是製表符而不是每個操作行之前的空格。

+0

也不起作用。 – etamar211 2014-11-03 11:42:40

+0

這是'.o'規則缺少'-o'標誌... – 2014-11-03 11:45:36

+0

@OliverCharlesworth:謝謝 - 修正。 – Edward 2014-11-03 11:47:21

1

要添加到愛德華的答案,簡化版本

all: task1 

task1 : main.o ceaser.o 
     gcc $^ -o [email protected] 

%.o : %.c 
     gcc -c -g -Wall $< -o [email protected] 

clean: 
     rm *.o 

cleanall: 
     rm task1 *.o 

其中 「$?」是依賴項的列表,「$ @」是目標輸出,「$ <」是第一個依賴項。

+0

這是一個很好的答案,但在這種情況下,您確實需要'$ ^'而不是'$?'。區別在於'$ ^'包含了所有先決條件,而'$?'只包含了比目標更新的那些。對於連接階段,我們總是希望包含所有'.o'文件。 – Edward 2014-11-03 13:17:53

+0

$?包括自上次make調用以來發生更改的目標。所以它並不總是試圖構建可用的目標,但沒有改變。在$ ^的情況下,不考慮時間戳,所有目標都被建立。 – 2014-11-03 13:25:47

+0

問題是,如果你更新'main.c'而不是'ceaser.c',則鏈接步驟將是'gcc main.o -o task1',這是錯誤的,因爲它不包含'ceaser.o'。 – Edward 2014-11-03 15:29:03