簡單而又完整的Makefile

2021-06-22 10:03:02 字數 2356 閱讀 3201

剛開始學習makefile是乙個痛苦的過程,從雜亂無章的規則到乙個簡單的makefile再到乙個系統化的makefile不是一蹴而就的事情。今天我就寫乙個簡單的,規範的(相對而言),功能也算齊全的makefile。適合於初學者的makefile。希望對新加入linux的同學們有用;

一,原始檔準備

假設在專案資料夾(pname)中我們有原始檔:main.c com1.c com2.c com3.c com4.c 以及他們的標頭檔案;在專案資料夾中有乙個子目錄 mylib;在pname/mylib中有乙個display.c及其標頭檔案。

二,分析

在main.c中有我們的主函式,它會呼叫其他每乙個原始檔的乙個函式(讓他們串聯起來)。我們把mylib裡面的所有原始檔編譯成乙個庫(libyuer.a),最後連線到我們的專案中;

三,makefile樣例

#首先我們定義我們的命令變數

cc      =       gcc

ar      =       ar

rm     =       rm

cp     =       cp

#然後設定我們的引數變數

includes    = -i./mylib

cflags    += -o2 $(includes)

lkflags    += -l./mylib

#定義我們需要的各種區域性變數

libs             = -lyuer

objs           = main.o com1.o com2.o com3.o com4.o

installdir = /user/bin/pname

#利用我們準備好的各種變數定義規則

all:$(target)

$(target):$(objs) $(libs)

$(cc) $(lkflags) $(objs) $(libs) -o $@

mylib/libmylib.a::

$(make) -c mylib

%.o:%.c

$(cc) -c $(cflags) $< -o $@

#安裝程式到指定的目錄

install:

$(cp) $(target) $(installdir)

#不要忘記清除中間檔案,目標檔案,子目錄檔案哦

clean:$(subdir_clean)

-$(rm) *.o $(target)

$(subdir_clean):

$(rm) -c mylib clean

四,說明

這是我個人總結的一些方法,不一定最好的,但還是希望對你們有幫助,特別是新手,剛開始的時候一定不要忽略了規範。其中引數變數還有很多可以設定(這裡只是乙個舉例),編譯命令前面必須以開始,我這裡用的是空格,所以複製測試的時候要注意。

五,子目錄mailefile

子目錄makefile用於將子目錄中的原始檔生成指定的庫,以被上層專案程式使用,子目錄makefile我們也遵循上面的格式

#首先我們定義我們的命令變數

cc      =       gcc

ar      =       ar

rm     =       rm

#然後設定我們的引數變數

includes    = -i../

cflags    += -o2 $(includes)

#定義我們需要的各種區域性變數

objs           = display.o

#利用我們準備好的各種變數定義規則

all:$(target)

$(target):$(objs)

$(ar) -rv $@ $(objs)

%.o:%.c

$(cc) -c $(cflags) $< -o $@

#不要忘記清除中間檔案,目標檔案,子目錄檔案

clean:

-$(rm) *.o $(target)

其實makefile中的cc,cflags,libs等沒有什麼區別,他們的性質的都是一樣的,就是變數。只是我對他們的叫法不一樣而已,我分別叫他們為:命令變數,引數變數,區域性變數;這樣只是為了方便記憶

這裡只是乙個簡單的makefile,如果你要做乙個大型的專案,上百個的原始檔,那麼就不是這麼簡單了,最好的做法可能你就應該把make分成幾個function.mak這樣的子makefile檔案,這樣便於管理,更多的使用makefile中的內建函式了。

我還沒有檢測過這個makefile,等我空了我會檢測一下的

**:

簡單而又深刻的認識 原碼 補碼 反碼

整數型別的儲存 前面 所說的位運算都沒有涉及負數,都假設這些運算是在unsingned word型別 只能表示正數的整型 上進行操作。但計算機如何處理有正負符號的整型呢?這個設計到補碼,反碼知識點,請看下面 假設有一 int 型別的數,值為5,那麼,我們知道它在計算機中表示為 00000000 00...

簡單的makefile例子

1.2.3 簡單的示例 本小節開始我們在第一小節中提到的例子。此例子由3個頭檔案和8個c檔案組成。我們講述寫乙個簡單的makefile,來描述如何建立最終的可執行檔案 edit 此可執行檔案依賴於8個c原始檔和3個頭檔案。makefile檔案的內容如下 sample makefile edit ma...

編寫簡單的makefile

假如有乙個上百個檔案的 構成的專案,如果只是對其中乙個或少數幾個檔案進行了修改,若用gcc編譯工具就不得不把整個專案裡的檔案重新編譯一遍。編譯過程分為編譯 彙編鏈結等階段。其中,編譯階段僅檢查語法錯誤以及函式與變數的宣告是否正確,在鏈結階段則主要完成函式鏈結和全域性變數的鏈結。因此,沒有改動的源 根...