makefile檔案編寫

2022-10-11 11:24:07 字數 1936 閱讀 8224

make [-f makefile檔名][選項][巨集定義][目標]

-idirname 指定被包含的makefile所在目錄

-w 如果make在執行時改變目錄,列印當前目錄名

-d 列印除錯資訊

-k 用該選項,即使make程式遇到錯誤也會繼續向下執行

1、顯式規則:用於描述系統中模組之間的相互依賴關係,以及產生目標檔案所要執行的命令(規則)。

編寫規則通用形式:

target : dependency [depenency [...] ]

command

command

注:command前是tab鍵,而非空格

使用這些命令來根據依賴模組產生目標,這裡的command既可以是gcc/g++編譯命令,也可以是shell命令或是其他可執行檔案。

main : main.o f1.o f2.o

gcc -o main main.o f1.o f2.o

main.o : main.c def1.h

gcc -c main.c

f1.o : f1.c def1.h def2.h

gcc -c f1.c

f2.o : f2.c def2.h def3.h

gcc -c f2.c

2、隱式規則:又稱預定義規則。隱式規則簡化了makefile的編寫和維護。(make命令帶-p選項),

比如:字尾規則,可以指定:.suffixes: .o .cpp

.cpp.o:

$(cpp) –c $<

3、模式規則提供的一種擴充套件make隱式規則的方法,規則與普通規則一樣,主要是目標必定含有%號,

比如:%.o : %.c

$(cc) -c $(cflags) $(cppflags)

$<

-o $@

4、變數定義(自動變數/預定義變數/自定義變數)

5、檔案指示(include, make -i, #if include)。

6、特殊字元:注釋# 轉義/ 萬用字元* 宿主目錄~ 模式字元「%」

「*.c」代表了當前工作目錄下所有的以「.c」結尾的檔案

「%」意思是匹配乙個或者多個字元,例如,「%.h」表示所有以「.h」結尾的檔案

1、定義方法: varname=some_text [...]

如: objs := howdy.o helper.o

2、變數引用:$(varname)或 $

示例:inc = $(patsubst %,-i%,$(allinc))

make支援的函式有:

$(subst ,,)

$(patsubst ,,)

$(filter ,) .....

7、分支語法

< conditional-directive>

< text-if-true>

endif

以及:< conditional-directive>

else

endif

注:conditional-directive可以是:ifeq(), ifneq(), ifdef, ifndef

分支語法示例:

libs_for_gcc = -lgnu

normal_libs =

foo: $(objects)

ifeq ($(cc),gcc)

$(cc) -o foo $(objects) $(libs_for_gcc)

else

$(cc) -o foo $(objects) $(normal_libs)

endif

注:上面示例的這個規則中,目標foo可以根據變數$(cc)的值選取不同的函式庫來編譯程式

8.make的妙用

•同步檔案至遠端伺服器:

cmdscp:

scp -p3600 exe [email protected]:/usr/local/..

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檔案編寫

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 ex...