Makefile檔案編寫

2021-09-20 06:06:04 字數 3328 閱讀 2512

main3.c

1 #include 2 #include "

static_lib.h

"3 #include "

fun.h"4

5int main(void

)

static_lib.h和

1

extern

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);

static_lib.c

1

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)

fun.h和

1

extern

void fun1();

fun.c

1 #include 2

void

fun1()

其中stati_lib.c中的檔案編譯成靜態庫

按照正常的編譯方法,這個程式可以按如下順序編譯

但是每次改了源**之後都這樣子編譯顯然是不明智的,所以需要編寫乙個makefile規則檔案

makefile的規則為

其中target是目標檔案或者動作

prerequisites是生成目標依賴的檔案

command是規則執行的命令,如果命令與依賴規則在一行,則以';'分割,如果在另一行,則以tab開頭

編寫乙個最簡單的makefile編譯這些原始碼

134

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.

其中patsubst是乙個函式,替換萬用字元,wildcard函式擴充套件萬用字元,展開目錄下的所有匹配檔案。

命令前面加'-'的話表示即便出錯也繼續執行。

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 顯式規則 用於描述系統中模組之間的相互依賴關係,以及產生目...