2010-09-02 46 views
3

我正在開發一個跨越多個C文件的第一個項目。對於我的第一對夫婦的練習程序,我只是在main.c中編寫了我的代碼,並使用gcc main.c -o main進行編譯。當我學習時,這對我有用。什麼是有效的C工作流程? - Makefile + bash腳本

現在,我正在自己的一個更大的項目上工作。我想繼續自己編譯(或者至少手動設置),這樣我就可以理解這個過程。讀了一下之後,我決定做一個Makefile。

注意:我也使用GTK +,所以我不得不查找如何將它添加到編譯命令中。

這是它看起來像一些研究後:

main: 
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0` 

起初,我只是跑「做」。然後我有一些問題,即使我已經更改了文件,但得到了「主要是最新的」錯誤。

所以我寫了一個腳本:

#!/bin/bash 
rm main 
make 
./main 

所以我做出改變,然後我運行此腳本。

這是一個很好/正常的系統?我想要有可擴展的系統,因爲我的項目會增長。我假設我可以保留這個腳本,只需要添加依賴關係到makefile中,並在makefile中更改主編譯命令。我對麼?

在此先感謝。

編輯:

感謝有關如何解決我的Makefile中的反饋。

那麼是典型的編譯過程1)類型make然後2)./main無論項目是如何設置或其大小(假設你已經寫了一個合適的makefile)?

+1

是的,你說得對。你先做一個'make'然後做一個'./main' – codaddict 2010-09-02 06:20:49

+0

太好了,謝謝!到目前爲止似乎相當容易學習。 – mouche 2010-09-02 06:29:04

回答

10

您需要告訴make main取決於main.c。這樣,每次您對main.c進行更改,然後運行make時,main都會重新生成。要刪除main你可以有一個假目標調用clean爲:

main:main.c 
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0` 

.PHONY: clean 
clean: 
    rm -f main 

我們刪除main你可以這樣做:make clean

如果你make: main is up to date.這意味着你沒有修改main.c,因此不存在需要重新生成main。但是,如果您必須強制重新生成main,即使依賴關係尚未更新,也可以使用make-B選項,如Sjoerd在其他答案中所建議的那樣。

+4

在「clean」目標之上添加一行'.PHONY:clean'是非常有用的,以防萬一名爲'clean'的文件(例如shell腳本)在目錄中結束。如果發生這種情況,make會看到文件並且不運行乾淨的目標。 「PHONY」告訴它甚至看不到。 – aaronasterling 2010-09-02 06:23:14

+0

非常有用的評論,@aaron。謝謝。 – mouche 2010-09-02 06:30:12

3
  • 使用make -Bmake --always-make編譯即使目標是到冒號後
  • 追加文件名日期,檢查是否這些被更新。

例子:

a: a.c 
     gcc -o a a.c 

a如果a.ca更新將只建造。

+0

對於一個更大的項目,'make -B'可能不是人們想要使用的。 – 2010-09-02 06:44:55

+0

對。如果某些文件的修改時間不正確,-B會很有用。例如,當您通過輸出文件複製某些內容時會發生這種情況。 – Sjoerd 2010-09-02 07:12:43

3

我發現命令行make足夠滿足我的需求,但手動編寫Makefiles變得相當麻煩。隨着項目日益複雜化,您會發現手工管理依賴關係變得越來越煩人。我建議你做的是學會如何做以下的至少一個:

  • 寫依賴跟蹤致電例如,gcc -MMakefile
  • 學習使用Makefile生成器,例如automakeCMake。我個人比較喜歡automake,因爲它比較成熟(並且不會像嘗試在命令行中放置以分號分隔的列表那樣的愚蠢的東西)。
+0

+1提到可用的Makefile生成器。我會檢查他們。 – mouche 2010-09-02 17:09:30