2013-03-24 74 views
7



我正在學習C編程,通過「學習C硬路」。我目前正在練習1,可以在這裏找到:http://c.learncodethehardway.org/book/ex1.html使用「make」C編程(學習困難的方法)

我理解被覆蓋的概念,但不理解編譯過程。而在命令行中使用了「make」命令,爲什麼這個工作:

$ make ex1 

這不行:

$ make ex1.c 

我其實只是運行第二個命令,直到一分鐘前。我終於明白了。直到我做到了,我不停地收到此錯誤信息:

make: nothing to be done for 'ex1.c' 

雖然這是一個公正的一個技術性,我還是想知道發生了什麼。謝謝:)

+0

不是gcc ex1.c -o ex1?因爲gcc是C編譯器。 – Survivor 2013-03-24 18:49:29

+0

這個問題更多的是關於'make'程序而不是C語言。 – aschepler 2013-03-24 18:50:44

+0

對不起,在將來的所有問題中都會記住這一點。這實際上是我在stackoverflow上的第一篇文章,而且答案驚人地快!再次感謝你們所有人。 – antigravityguy 2013-03-24 19:01:28

回答

12

雙方工作;他們只是做不同的任務。

  • make ex1.c說:「通過使用Makefile再加上內置的知識規則,確保文件ex1.c是最新的」。

    make程序找到ex1.c,並且沒有規則從其他東西(例如沒有RCS或SCCS源代碼)構建它,所以它報告'沒有事情要做'。

  • make ex1說「使用makefile中的規則和內置知識,確保文件ex1是最新的」。

    make程序發現它知道一種方式來創建從源文件ex1.c可執行ex1,所以它可以確保源文件ex1.c是最新的(它的存在,因此它是最新的),然後確保ex1也是最新的(這意味着'文件ex1最近修改比ex1.c更近)。如果自上次運行make以來編輯ex1.c,則編譯時會使ex1ex1.c更新。如果編譯失敗,文件ex1將不存在,所以您下次也會再次進行重新編譯。一旦它變爲最新狀態,make將不會再次重建ex1,直到您再次修改源代碼。

這是make的設計工作方式。

+0

感謝您的詳細回覆。這很有道理,雖然來自python環境,但這看起來非常嚴格 – antigravityguy 2013-03-24 19:03:23

+4

我以前從未見過這個網站,但Ex 2的標題「Make Your Python Now」非常具有誤導性。我得到他們想說的,但Make不是Python。比較Make和Python就像比較一把雕刻刀和一個廚房。 Make是專門爲更新過時的文件而設計的。這非常好。 Python被設計成一種通用語言。這非常好。我建議你忽略這種比較:它似乎比讓我感到困惑。 – MadScientist 2013-03-25 13:18:15

4

目標到make通常指定你想要它建立或重建,而不是你想要它用來建立別的東西。

如果您鍵入ex1.c(並且沒有規則自動生成它),那麼基本上只會回答「是的,該文件存在。」

1

make工具的參數是可執行文件的名稱,它 將幫助您爲您創建。它不應該有.c擴展名。你應該有 只寫make ex1