Makefile

什么是makefile?或許很多Winodws的程序員都不知道這個東西,因為那些Windows的IDE都為你做了這個工作。特別在Unix下的軟件編譯,你就不能不自己寫makefile了,會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力

因為,makefile關系到了整個工程的編譯規(guī)則。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要編譯,哪些文件需要編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執(zhí)行操作系統的命令

makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率。

make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。

在這篇文檔中,將以C/C++的源碼作為我們基礎,所以必然涉及一些關于C/C++的編譯的知識,相關于這方面的內容,還請各位查看相關的編譯器的文檔。這里所默認的編譯器是UNIX下的GCC和CC。

0.1 關于程序的編譯和鏈接
在此,我想多說關于程序編譯的一些規(guī)范和方法,一般來說,無論是C、C++、還是pas,首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然后再把大量的Object File合成執(zhí)行文件,這個動作叫作鏈接(link)。 編譯時,編譯器需要的是語法的正確,函數與變量的聲明的正確。對于后者,通常是你需要告訴編譯器頭文件的所在位置(頭文件中應該只是聲明,而定義應該放在C/C++文件中),只要所有的語法正確,編譯器就可以編譯出中間目標文件。一般來說,每個源文件都應該對應于一個中間目標文件(O文件或是OBJ文件)。 鏈接時,主要是鏈接函數和全局變量,所以,我們可以使用這些中間目標文件(O文件或是OBJ文件)來鏈接我們的應用程序。鏈接器并不管函數所在的源文件,只管函數的中間目標文件(Object File),在大多數時候,由于源文件太多,編譯生成的中間目標文件太多,而在鏈接時需要明顯地指出中間目標文件名,這對于編譯很不方便,所以,我們要給中間目標文件打個包,在Windows下這種包叫“庫文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
總結一下,源文件首先會生成中間目標文件,再由中間目標文件生成執(zhí)行文件。在編譯時,編譯器只檢測程序語法,和函數、變量是否被聲明。如果函數未被聲明,編譯器會給出一個警告,但可以生成Object File。而在鏈接程序時,鏈接器會在所有的Object File中找尋函數的實現,如果找不到,那到就會報鏈接錯誤碼(Linker Error),在VC下,這種錯誤一般是:Link 2001錯誤,意思說是說,鏈接器未能找到函數的實現。你需要指定函數的ObjectFile.

好,言歸正傳,GNU的make有許多的內容,閑言少敘,還是讓我們開始吧。


17/01/16
寫了兩個程序,分別為a.c,b.c,不用makefile怎么編譯?
先看一個怎么編譯吧

#include <stdio.h>
#include <stdlib.h>
int main(){
printf("Hello");
return 0;
}
x@ubuntu:~/Desktop/make$ gcc -o h main.c
x@ubuntu:~/Desktop/make$ ./h

再看兩個

extern void p(char *);
int main(){
    p("Hello Wordl!");
    return 0;
}
#include <stdio.h>
void p(char *str){
    printf("%s\n",str);
}

可見多個程序一起編譯,先后順序沒有關系

makefile中用的語法是
gcc a.c b.c -o h3 worked.不用makefile直接跑也能成功。看來有多種等價語法

x@ubuntu:~/Desktop/make$ gcc -o h1 a.c b.c
x@ubuntu:~/Desktop/make$ gcc -o h2 b.c a.c
x@ubuntu:~/Desktop/make$ gcc a.c b.c -o h3

下面在miakefile中試試

hello: a.c b.c
    gcc a.c b.c -o hello
makefile的功能就是代替gcc等命令

發(fā)揮makefile的優(yōu)勢,自動編譯直到可執(zhí)行文件

hello: a.o b.o
    gcc a.o b.o -o hello
a.o: a.c
    gcc -c a.c
b.o: b.c
    gcc -c b.c
自動化

只重新編譯更改后的文件


只重新編譯更改后的文件

進一步改造makefile,使用宏變量
-宏變量相當于快捷鍵。

EXE=hello
OBJS=a.o b.o
CC=gcc
$(EXE): $(OBJS)
    $(CC) $(OBJS) -o $(EXE)
a.o: a.c
    $(CC) -c a.c
b.o: b.c
    $(CC) -c b.c
clean:
    rm -rf *.o $(EXE)

這個makefile是成功的。
但是加上$(CFLAGS)是失敗的。不知道$(CFLAGS)代表什么意思。
使用Makefile 內部宏變量,可使Makefile 進一步簡化

EXE=hello
OBJS=a.o b.o
CC=gcc
$(EXE): $(OBJS)
    $(CC) $^ -o $@
a.o: a.c
    $(CC) -c $<
b.o: b.c
    $(CC) -c $<
clean:
    rm -rf *.o $(EXE)
由于a.c b.c 都沒有變,所以只進行了鏈接操作,makefile的自動化工作還是成功的

使用Makefile 的隱含規(guī)則,迚一步簡化Makefile:

EXE=hello
OBJS=a.o b.o
CC=gcc
$(EXE): $(OBJS)
    $(CC) $^ -o $@
.c .o:
    $(CC) -c $<
clean:
    rm -rf *.o $(EXE)
所有文件從.c到.o的過程一樣,所以進一步省略,高度簡化
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • 來自陳浩的一片老文,但絕對營養(yǎng)。 示例工程:3 個頭文件*.h,和 8 個 C 文件*.c。 初 編譯過程,源文件...
    周筱魯閱讀 4,723評論 0 17
  • makefile關系到整個工程的編譯規(guī)則,一個工程中的源文件不計其數,按其類型、功能、模塊分別放在若干的目錄當中,...
    Joe_HUST閱讀 1,891評論 0 3
  • @(linux 編程)[開發(fā)技能, 工具使用] What is GNU Make Make 是控制工程中通過源碼生...
    orientlu閱讀 11,367評論 0 26
  • 《時間去哪兒了》這部電影,如果從創(chuàng)作的出發(fā)點看,五個部分,個人給的關鍵詞依次是:事件,創(chuàng)意,遺憾,科幻,政策。 事...
    神經影FUN閱讀 378評論 0 1
  • 一些文學大家的作品往往多種風格并存,如蘇軾有“大江東去,浪淘盡”的豪放,也有“十年生死兩茫茫,不思量,自難忘”的深...
    棉托鞋閱讀 836評論 0 3