剛開始學習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編譯工具就不得不把整個專案裡的檔案重新編譯一遍。編譯過程分為編譯 彙編鏈結等階段。其中,編譯階段僅檢查語法錯誤以及函式與變數的宣告是否正確,在鏈結階段則主要完成函式鏈結和全域性變數的鏈結。因此,沒有改動的源 根...