main3.c
1 #include 2 #include "static_lib.h和static_lib.h
"3 #include "
fun.h"4
5int main(void
)
1static_lib.cextern
int add(int a,int
b);2
extern
int sub(int a,int
b);3
extern
int mul(int a,int
b);4
extern
int div(int a,int b);
1fun.h和int add(int a,intb)4
5int sub(int a,intb)8
9int mul(int a,int
b)12
13int div(int a,int
b)
1fun.cextern
void fun1();
1 #include 2其中stati_lib.c中的檔案編譯成靜態庫void
fun1()
按照正常的編譯方法,這個程式可以按如下順序編譯
但是每次改了源**之後都這樣子編譯顯然是不明智的,所以需要編寫乙個makefile規則檔案
makefile的規則為
其中target是目標檔案或者動作
prerequisites是生成目標依賴的檔案
command是規則執行的命令,如果命令與依賴規則在一行,則以';'分割,如果在另一行,則以tab開頭
編寫乙個最簡單的makefile編譯這些原始碼
134其中patsubst是乙個函式,替換萬用字元,wildcard函式擴充套件萬用字元,展開目錄下的所有匹配檔案。fun.o :
5 gcc -c fun.c
6static_lib.o :
7 gcc -c static_lib.c89
static_lib.a : static_lib.o
10ar rcs static_lib.a static_lib.o
1112
clean :
執行make clean可以將原來的清理掉
執行make會重新編譯原始碼
這樣當我們修改源**之後就可以簡單的編譯原始碼了
但上面的makefile顯然不夠簡潔,我們可以利用一些make的隱式規則,簡寫makefile,這些隱含規則可以通過 make -p 指令檢視。12
34 static_lib.a : static_lib.o # 隱含會尋找*.c檔案編譯成*.o檔案5ar
rcs static_lib.a static_lib.o67
clean :8
執行make可以看到依然能夠編譯成功
其中cc是乙個符號鏈結
還可以進一步使用一些變數,進一步提高makefile的可維護性
1 cc = gcc
2 objs =main3.o static_lib.a fun.o
3 gen_opts = -o 45
67 static_lib.a : static_lib.o # 隱含會尋找*.c檔案編譯成*.o檔案8ar
rcs static_lib.a static_lib.o910
clean :11
執行make
而且可以看到 1,2,4行的gcc存在縮排,說明隱含規則也使用指明的cc變數編譯。
進一步的,我們可以使用一些自動化的變數。
1 cc = gcc
2 objs =main3.o static_lib.a fun.o
3 gen_opts = -o 45
67 static_lib.a : static_lib.o # 隱含會尋找*.c檔案編譯成*.o檔案
8ar rcs $@ $^910
clean :11
其中自動化變數 $@表示規則中的目標檔案集,$^表示依賴集,這個makefile執行之後也能得到想要的結果
最後結合前面的變數,再結合函式,等寫乙個更完善的makefile,可以做到增加了新的c檔案或**件不需要修改makefile檔案,再次之前,首先將static_lib.* 移動到lib目錄下,將其餘原始碼檔案移動到src目錄。
並修改main3.c的include為 ../lib/static_lib.h,修改makefile檔案如下
1 cc = gcc
2 src = ./src
3 lib = ./lib
4 objs = $(patsubst %.c, %.o, $(wildcard $(src)/*
.c))
5libs = $(patsubst %.c, %.a, $(wildcard $(lib)/*.c))
6gen_opts = -o 78
9@echo "gen done"
10# 將lib目錄下的c檔案編譯成a庫檔案
11$(libs) : $(patsubst %.c, %.o, $(wildcard $(lib)/*.c))
12ar rcs $@ $^
1314
clean :
1516
@echo clean done.
命令前面加'-'的話表示即便出錯也繼續執行。
makefile檔案編寫
hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...
Makefile檔案編寫
1 基本大全教程 2 四個賦值的區別 是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值其中 和 的區別是 立馬賦值,是整個makefile檔案讀取完後賦值。1 make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile...
makefile檔案編寫
make f makefile檔名 選項 巨集定義 目標 idirname 指定被包含的makefile所在目錄 w 如果make在執行時改變目錄,列印當前目錄名 d 列印除錯資訊 k 用該選項,即使make程式遇到錯誤也會繼續向下執行 1 顯式規則 用於描述系統中模組之間的相互依賴關係,以及產生目...