什麼是makefile
可以簡單的認為是乙個工程檔案的編譯規則,描述了整個工程的編譯和鏈結等規則。其中包含了那些檔案需要編譯,那些檔案不需要編譯,那些檔案需要先編譯,那些檔案需要後編譯,那些檔案需要重建等等。編譯整個工程需要涉及到的,在 makefile 中都可以進行描述。換句話說,makefile 可以使得我們的專案工程的編譯變得自動化,不需要每次都手動輸入一堆原始檔和引數。
為什麼要使用makefile
1、簡化編譯
編譯的時候需要鏈結很多庫, gcc 只會預設鏈結一些基本的c語言標準庫,很多原始檔依賴的標準庫都需要我們手動鏈結,很麻煩,如果使用makefile把要鏈結的庫檔案放在 makefile 中,制定相應的規則和對應的鏈結順序。這樣只需要執行 make 命令,工程就會自動編譯。每次想要編譯工程的時候就執行 make
2、節省時間
makefile 支援多執行緒併發操作,會極大的縮短我們的編譯時間,並且當我們修改了原始檔之後,編譯整個工程的時候,make 命令只會編譯我們修改過的檔案,沒有修改的檔案不用重新編譯,大大提高編譯的效率(那麼系統是如何判斷檔案是否被修改呢?這裡就會涉及到timestamp(時間戳),依賴檔案與目標檔案都有乙個對應時間戳,當依賴檔案被修改後時間戳會更新,下一次進行編譯時系統會對比依賴檔案與目標檔案的時間戳,若目標檔案時間戳早於依賴檔案,則說明依賴檔案被修改系統就會重新編譯;若沒則不會被重新編譯)
makefile怎麼寫
1、makefile格式
目標檔案:依賴檔案
執行指令 ...
2、示例:
編寫乙個a.c檔案將它編譯生成乙個可執行檔案需要以下幾個步驟:
①a.c ->a.i
②a.i ->a.s
③a.s ->a.o
④a.o ->a
最後執行;(具體講解請看上一期文章:
)而將這個過程運用makefile檔案進行編寫如下
1我們發現生成可執行檔案a需要4步,也就是先由a.c編譯生成a.i;再從a.i編譯生成a.s;再從a.s編譯生成a.o;最後由a.o編譯生成可執行檔案a;我們可以看出:要先生成a.o這個中間檔案才能生成a這個可執行檔案,a.o這個檔案稱為目標檔案a的直接依賴檔案,那麼a.s又是a.o的直接依賴檔案,依次類推;makefile正是依據這樣一層一層的的依賴關係和連線 依賴檔案 和 目標檔案 的命令 所構成的。build:a
2 ./a
3a:a.o
4 gcc -o a a.o
5a.o:a.s
6 gcc -c a.s
7a.s:a.i
8 gcc -s a.i
9a.i:a.c
10 gcc -o a.i -e a.c
11clear:
12 rm -rf a a.o a.s a.i
附(執行效果):
3、注意
①系統預設執行第乙個目標檔案,然後依次找它的依賴檔案,若後邊的目標檔案與前面的所需要的依賴檔案無關,則不執行,從這裡可以看出計算機是按正常邏輯一層一層執行(從下往上),而我們寫的makefile檔案就需要倒著寫;
②可指定執行特定目標檔案格式:make 《目標》
makefile 使用共享庫檔案so
環境 vmware workstation centos 6.4 x86 64 說明 2 gcc在鏈結的時候要加 l引數和 l引數 l後面跟的共享庫檔案的名字 如 共享庫檔案的名字如果是libmyso.so,那麼在寫的時候,就要把前面的lib和後面的.so去掉,得到myso。4 l 告訴gcc共享庫...
Makefile檔案解析
在makefile中,除第一條命令外,每一條命令的開頭必須是tab製表符,比如 cc arm linux gcc exec hello objs hello.o cflags ldflags static all exec exec objs cc ldflags o objs clean rm f...
makefile檔案介紹
cflags 表示用於 c 編譯器的選項,cxxflags 表示用於 c 編譯器的選項。這兩個變數實際上涵蓋了編譯和彙編兩個步驟。cflags 指定標頭檔案 h檔案 的路徑,如 cflags i usr include i path include。同樣地,安裝乙個包時會在安裝路徑下建立乙個incl...