Makefile寫法入門心得

2022-05-14 02:08:20 字數 2951 閱讀 9711

makefile的寫法入門心得

makefile的出現使得編譯過程極大地自動化了,省去了很多人工工作,非常方便。這裡,小結一下寫makefile的一點小心得。嗯,對了,差點忘了一件事,同乙個makefile在不同的核心版本和linux發行版本中不一定能發揮一樣的作用,別人的makefile可不見得就適用於自己的機器。

我先簡單說一下我自己的機器: ubuntu12.04-kernel-3.4.5,核心是根據我自己機器的配置裁剪過的,不過估計這個影響不大,當然,大神們就別批小弟了,咱的水平還不至於寫非常貼近底層的東西。

好了,開始介紹。

下面是乙個在網上非常氾濫的模板,雖然氾濫,但就是沒有乙個人把這個模版做乙個剖析,我這個菜鳥就勉強試一試好了。事前說明:如果在每一段的最前面有空格的,記住那是tab鍵,是makefile裡面專門用於寫命令時固定的格式:

#source file

src = threadqueue.cpp

#object file

obj = $(src:.cpp=.o)

#output execution file

program = threadqueue

#compiler

cc = g++

#include

include = -i/usr/include/ncurses –i/usr/include/

#linker parameter

linkparam = -lpthread -lncurses

#options for development

#cflags = -g

#options for release

cflags = -o

all: $(program)

$(program): $(obj)

$(cc) -o $(program) $(linkparam) $(obj)

.suffixes : .cpp

.cpp.o:

$(cc) $(include) $(cflags) -c $<

clean:

-rm *.o

下面一行一行的來解析這個makefile。

首先解釋第一行以及好多行都出現的「#」號,注釋,完全是注釋,跟c語言中的//是一樣的,在標準的linux核心makefile中有很多內容都是幫你理解的注釋。

第二行是乙個變數的定義,變數名為src,變數定義為threadqueue.cpp,這樣要引用變數時寫作「$(變數名)」即可,就等價為變數的定義內容。

第三行注釋,讀讀就好。

第四行這裡又定義了乙個變數,請注意,它的定義引用了src變數,同時,用到了變數替換,這裡

src:.cpp=.o的意思是指將src下所有以.cpp結尾的檔案的.cpp替換為.o,也就定義了要輸出的所有檔案。

第五行,注釋的說。

第六行是定義變數,這裡順便再一提,這個就是我們在編譯過程中最後要得到的東西,即threadqueue.o。

第七行又是注釋的說。

第八行的變數定義是指cc代表的就是gcc編譯器。嗯,據我自己這幾天的經驗,絕大部分makefile(包括標準的linux makefile)都是這麼寫的。

第九行(這裡是指有內容的第九行,不包括空行)注釋的說。

第十行,又是乙個變數定義,這裡就得交待一件事情了:在makefile中變數的定義是很靈活的,基本可以理解為c語言下的巨集定義,你定義神馬都可以,你可以用變數來定義乙個檔名列表,定義乙個可執行檔名,也可以把變數定義成編譯器命令選項。

第十一行,注釋的說。

第十二行,這裡也是乙個變數的定義,這個變數作為gcc編譯時的編譯器選項使用。

第十三至十五行皆是注釋,不過這三行以及下面的第十六行還是有其他作用的,待到十六行處再講。

第十六行,這裡連帶著上面的三行一起講,看英文也應該看出來這裡四行的作用了。是這樣的,如果你是想自己要除錯用的話,你就保留「options for develop」下面的那一行,把之前的「#」號去掉,而你要是想生成不可除錯的發行版,那就選擇讓第十六行生效。這裡,為什麼會有這樣的區別就涉及到gcc編譯器使用選項的問題了,留做他日再寫。

第十七行,all是乙個標籤,你可以理解成乙個跳轉符號,如果想讓make程式在編譯時執行某乙個特定的指令,就可以把這個指令做成乙個標籤,這樣在命令列裡輸入「make name_of_your_label」就可以執行某一特定部分的編譯了。

第十八、十九、二十行,來到這裡就不得不提一般的makefile的書寫格式了,這也是為什麼我要把三行在一起交待,如下:

目標:依賴

命令……

必須注意的是,命令前面的不是空格,而是製表符tab,這是makefile書寫時必須遵循的規則。那我們看到上面的模板中,我們要生成的是program所代表的變數,而所需要的依賴就是obj中所有的.o檔案,生成時的命令是「$(cc)

-o $(program) $(linkparam) $(obj)」,根據他們各自的變數定義可知,之一段命令可以翻譯為「gcc –o threadqueue -lpthread –lncurses threadqueue.o」,其中前面帶有-的幾個字母都是gcc編譯時的選項,改天再總結一下gcc編譯器的使用。

第二十一行,這裡的「.suffixes」是乙個偽目標,它的作用類似於乙個標籤,在偽目標之後的所有內容將不會被檢查是否已經執行,而是將它直接執行。

第二十二、二十三行,這裡.cpp.o是老式的「字尾規則」,編譯器將會自動將.cpp識別為原始檔字尾,而.o識別為輸出檔案字尾。,suffixes也是習慣上用來定義字尾規則的偽目標。特別需要注意的是,字尾規則不允許任何依賴檔案,但也不能沒有命令。

第二十四、二十五行,這裡定義了clean命令的執行規則,以及所要清除的檔案的字尾名,如果你還想在clean時清除什麼字尾的檔案的話,就再寫上」*.post_name」即可,非常方便。

小結:makefile的寫法還是比較複雜的,我這一篇文章只提及了很少的一點,給大家推薦乙個人的部落格,他曾經寫過《跟我一起學寫makefile》,希望該大神的部落格能對你有所幫助:

by air_figher

12.07.21

常見makefile寫法

1 目標名稱,擺脫手動設定目標名稱 cpp view plain copy target notdir curdir all target cmd.curdir 表示makfile當前目錄全路徑 notdir path 表示把path目錄去掉路徑名,只留當前目錄名 這樣就可以得到makefile當前...

makefile寫法簡單示例

作為linux或unix下的程式開發人員,大家一定都遇到過makefile,用make命令來編譯自己寫的程式確實是很方便。一般開發情況下,大家都是手工寫乙個簡單makefile。下面先給乙個最簡單的示例 makefile示例 object main.o function.o change objec...

makefile的寫法 一

linux中使用g 的方法 第一步預處理 g e test.cpp o test.i o 表示輸出的專案 該部處理將巨集,typedef等處理替換 結果是 i 檔案 1.預處理 pre processing gcc e test.c o test.i i檔案 第二步編譯 g s test.i o t...