2011-05-03 69 views
2

爲了說明問題,假設我正在編譯一個程序(prg),其中包含3個文件,main.cperson.hperson.c使用Makefile中的標誌進行編譯

如果我用寫makefile文件,這樣的(更具體的最後兩行)的一個簡潔的方式:

prg : main.o person.o 
    gcc -Wall -o prg -c $^ 

main.o : person.h 
person.o : person.h 

請問-Wall應用於main.operson.o自動?或者這甚至不重要?

我知道,如文件所述,如果person.o需要重新編譯,prg也需要重新編譯。但是,我不知道僅僅在主要目標中指定-Wall是否足以使其他目標成爲可能,以便在編譯其他目標時發出警告。也許我錯過了一些非常重要的東西,或者我說了一些毫無意義的東西;但是很簡單,我只是一個初學者:P

+0

運行makefile時,它爲您運行的命令將顯示在控制檯中。你可以很容易地看到它使用的是什麼標誌。 – 2011-05-03 14:31:07

+1

這個問題標題看起來不對。問題是關於make,而不是gcc標誌。 – 2011-05-03 14:34:03

+0

@David Thornley:我只是編輯它,我希望現在更清楚。對不起,有任何困惑。 – sidyll 2011-05-03 15:59:01

回答

6

由於您將-Wall應用到鏈接階段(將目標文件收集到可執行文件時),但該選項適用於編譯階段(將源文件轉換爲目標文件),但它在寫入時沒有任何好處。

您應該通過設置宏來修改編譯。

通常情況下,編譯的C源文件到目標文件中的規則看起來像:

${CC} ${CFLAGS} -c $*.c 

有可能是在那裏等位,符號可能使用其他的東西比$*.c識別源文件 - 有類似的(大致相同的)指定方法,但它與我所做的觀點是相切的。 $(CC)表示法也相當於${CC}

因此,要更改編譯器,請指定'CC=new_c_compiler'並更改爲編譯選項,您(謹慎地)指定'CFLAGS=-Wall'。

這可以在makefile或命令行中完成。命令行覆蓋makefile。

因此:

CFLAGS = -Wall 

prg : main.o person.o 
    ${CC} ${CFLAGS} -o prg -c $^ 

main.o : person.h 
person.o : person.h 

爲什麼謹慎?因爲在更復雜的情況下,CFLAGS的複雜定義可能會由多種來源構成,並且巧妙地設置CFLAGS = -Wall可能會丟失包含路徑,宏定義和各種類型。在你的情況下,它看起來像你可以簡單地設置它如圖所示。

如果使用了GNU make,你可以簡單地添加到-WallCFLAGS

CFLAGS += -Wall 

這並不一定適用於所有品種的make工作。

您的鏈接線可能最終還需要收集一些與庫相關的選項。

6

不,這些標誌不會神奇地應用於其他目標。

這樣添加一行到你的Makefile頂部,上述規則:

CFLAGS=-Wall 

然後嘗試沒有爲prg明確的線。