2015-11-20 80 views
1

現在我正在研究一些計算機科學課程的練習題。一個我遇到的那些都涉及makefile和去如下:確定在C中使用makefile時將運行哪些命令?

You are working in a directory which contains the following files and no others: 
makefile  myscript  one.c  three.c  two.h 
------------------------------------ 
Here are the contents of makefile: 

CC=gcc 
CFLAGS=-ansi 

myprogram: two.o three.o 
gcc -o myprogram two.o three.o 

two.c: one.c myscript 
sed -rf myscript one.c >| two.c 

three.o: two.h 
------------------------------------ 

1.) If you type `make myprogram` in this directory, what commands will be run? 

2.) After the commands are run, what new files will have been created? 

3.) After this, you edit `two.h` (and no other files) and then type make `myprogram` again. What 
commands will be run? 

所以從我有限的瞭解Makefile我知道,1.)命令來運行將gcc -o myprogram two.o three.o,因爲myprogram不存在目錄。然而,two.othree.o也不存在...這是我有點失落的地方,然後我會在two.c: one.c myscript下運行命令,因爲它強制覆蓋?任何幫助非常感謝,謝謝!

回答

3
  • three.o

    有一個爲three.o一個特定的規則,所以,說明如該three.o從何而來。

  • two.o

    make有很多潛規則:它知道(猜測),如果它發現一個*.c文件,應該把它編譯成一個*.o文件,如果有它沒有具體的規則,甚至走一個進一步並創建一個a.out /可執行文件。

    這些隱含的規則將適用於two.o的情況,該規則沒有具體規則,但make可以從two.c推導出規則。

  • three.o(再發生)

    make也可以做出很好的猜測源文件應該是什麼,如果它沒有給出:在three.o的情況下,它會嘗試並匹配以three.c,這是合乎邏輯的該對象文件的源文件。 (two.h只是一個附加依賴項)。


如果你真的想知道,創造了鍛鍊。這可能有點困難,因爲myscriptsed命令,但請記住,你基本上可以創建幾乎空的源文件(在頭文件中包含守衛仍然是一個好主意,所以它不會意外地包含兩次)。

然後,您可以使用-d(調試)標誌或-n(no-op標誌;不要執行任何操作)運行make。剛剛通過步驟1,2和3.

當然,這樣做可能顯示你會發生什麼,但這並不意味着你明白它。將這與您瞭解Make的內容結合起來,上面的回答和運行實際實驗所得到的結果應該會讓您走得很遠。

+0

好吧,「two.o」和「three.o」會因爲隱含的make規則而被「製造」? –

+1

'two.o'在我的答案中;請仔細閱讀。 'three.o'有一個規則,但是有一個隱含的源文件(所以稱之爲Make使用「部分隱式規則」)。 – Evert

+0

非常感謝您的幫助,我會盡我所能去理解您所展示的一切! –

0

一些使實用程序可以選擇顯示將運行的命令,但不運行它們。例如,對於Linux和Unix來說,它是-n,--just-print,--dry-run,--recon。對於Microsoft nmake,該選項是/ n。

如果涉及腳本或批處理文件,可能會更困難。