srcs += $(wildcard *.c)
複製**
objs := $(srcs:.c=.o)
複製**
objs := $(addprefix path/,$(objs))
複製**
本質:匹配當前目錄下的檔案,然後根據模式將當前目錄下的檔案進行特定替換前提:工作目錄中存在func.c main.c 說明:
%.o : %.c
gcc -o $@ -c $^
複製**
與變數的值替換的區別:變數值替換是從給定的列表中將檔案一一進行匹配,然後放入指定的依賴中;變數值替換如下所示:
objs := func.o main.o
$(objs) : %.o : %.c
gcc -o $@ -c $^
複製**
編譯規則的依賴如下:
示例**--變數與函式的綜合應用源**如下:const.c
const char* g_hello = "hello-makefile";
複製**
func.c
#include "stdio.h"
extern char* g_hello;
void foo
()
複製**
main.c
extern void foo();
int main
()複製**
makefile
cc := gcc
mkdir := mkdir
rm := rm -rf
dir_objs := objs
dir_target := target
dirs := $(dir_objs) $(dir_target)
#target/hello-makefile.out
target := $(dir_target/hello-makefile.out
#srcs =
srcs := $(wildcard *.c)
#objs =
objs := $(srcs:.c=.o)
#objs =
objs = $(addprefix $(dir_objs)/,$(objs))
.phony : rebuild clean all
$(target) : $(dirs) $(objs)
$(cc) -o $@ $(objs)
@echo
"target file => $@"
$(dirs) :
$(mkdir) $@
$(dir_objs)/%.o : %.c
ifeq ($(debug),true)
$(cc) -o $@ -g -c $^
else
$(cc) -o $@ -c $^
endif
rebuild : clean all
all : $(target)
clean :
$(rm) $(dirs)
複製**
執行結果如下:
下列左圖為命令列執行make debug:=true的結果;右圖為命令列執行make的結果;可以看到,當命令列指定deubg值之後,進入target資料夾後命令列執行objdump -s hello-makefile.out可以看到彙編除錯****現了原始檔中的**,方便進行除錯。而右圖僅僅只有彙編部分**。
makefile 變數與 函式的綜合示例
srcs wildcard c objs srcs c o objs addprefix path objs 本質 匹配當前目錄下的檔案,然後根據模式將當前目錄下的檔案進行特定替換前提 工作目錄中存在func.c main.c 說明 o c gcc o c 與變數的值替換的區別 變數值替換是從給定的...
makefile專題 變數與函式的綜合示例
1 自動生成target資料夾存放可執行檔案 2 自動生成objs資料夾存放編譯生成的目標檔案 o 3 支援除錯版本的編譯選項 4 考慮 的擴充套件性 wildcard parrern 獲取當前工作目錄中滿足 pattern的檔案或目錄列表 addprefix prefix,names 給名字列表 ...
makefile編譯選項與常用變數
d 條件選擇編譯 i 標頭檔案搜尋路徑 l 連線靜態庫 l 連線庫的路徑 wall 開啟警告開關 ar 靜態庫打包命令的名字,預設值是ar。arflags 靜態庫打包的選項,預設值rv as 彙編器的名字,預設值是as。asflags 彙編器的選項,沒有定義。cc c編譯器的名字,預設值是cc。cf...