makefile 變數與函式的綜合示例

2021-09-11 11:36:51 字數 2054 閱讀 6242

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