例項說明makefile 能增加巨集定義

2021-07-24 17:44:15 字數 4492 閱讀 5102

前言

從學習c語言開始就慢慢開始接觸makefile,查閱了很多的makefile的資料但總感覺沒有真正掌握makefile,如果自己動手寫乙個makefile總覺得非常吃力。所以特意借助部落格總結makefile的相關知識,通過例子說明makefile的具體用法。

1.只有單個c檔案

2.含有多個c檔案

3.需要包括標頭檔案路徑

4.增加巨集定義

5.增加系統共享庫

6.增加自定義共享庫

7.乙個實際的例子

【**倉庫】——makefile-example

【本例說明】

本例將說明makefile檔案中如何加入巨集定義。

1.gcc複習

巨集定義使用字首-d,在編譯過程中可以把巨集定義追加到cflag中。巨集定義有兩種相似的寫法

【第一種】-d defines

【第二種】-d defines=condition

2.原始檔

使用兩種不同的方式,通過巨集定義包裹列印功能,分別使用#ifdef和#if

[cpp] view plain

copy

#include 

#include 

#include 

int

main(

void

)

3.makefile

請替換其中的[tab],並以**倉庫中的makefile檔案為主。

[cpp] view plain

copy

# 指令編譯器和選項

cc=gcc

cflags=-wall -std=gnu99

# 巨集定義

defs = -dtest_add -dtest_sub=1

cflags += $(defs)

# 目標檔案

target=test

# 原始檔

srcs = test.c \

./test-add/test-add.c \

./test-sub/test-sub.c

# 標頭檔案查詢路徑

inc = -i./test-add -i./test-sub

# 目標檔案

objs = $(srcs:.c=.o)

# 鏈結為可執行檔案

$(target):$(objs)

#   @echo target:$@

#   @echo objects:$^

[tab]$(cc) -o $@ $^

clean:

[tab]rm -rf $(target) $(objs)

# 連續動作,請清除再編譯鏈結,最後執行

exec:clean $(target)

[tab]@echo 開始執行

[tab]./$(target)

[tab]@echo 執行結束

# 編譯規則 $@代表目標檔案 $< 代表第乙個依賴檔案

%.o:%.c

[tab]$(cc) $(cflags) $(inc) -o $@ -c $<

4.具體說明

makefile定義標頭檔案的方法有兩種

【第一種】-d defines 

【第二種】-d defines=condition

defs = -dtest_add -dtest_sub=1

為了說明問題,此處使用了兩種不同的寫法。此時兩處列印功能均被執行

cflags += $(defs)

追加到cflags中,此處需要強調cflags只是乙個變數,可以命名為任何合法的名稱,只要在編譯過程中引用該引數即可。

$(cc) $(cflags) $(inc) -o $@ -c $< 

5.執行過程

【編譯和鏈結】

make clean && make

【控制台輸出】

rm -rf test test.o ./test-add/test-add.o ./test-sub/test-sub.o

gcc -wall -std=gnu99 -dtest_add -dtest_sub=1 -i./test-add -i./test-sub -o test.o -c test.c

gcc -wall -std=gnu99 -dtest_add -dtest_sub=1 -i./test-add -i./test-sub -o test-add/test-add.o -c test-add/test-add.c

gcc -wall -std=gnu99 -dtest_add -dtest_sub=1 -i./test-add -i./test-sub -o test-sub/test-sub.o -c test-sub/test-sub.c

gcc -o test test.o test-add/test-add.o test-sub/test-sub.o

從控制台的輸出可以看出,在編譯過程中加入了-d引數。

【執行】

a=3

b=2a+b=5

a-b=1

最終效果和預期完全相同,makefile得到的驗證。

6.總結

增加巨集定義的兩個方法 -d defines  和 -d defines=condition

巨集定義追加到cflag之後

makefile 增加巨集定義

0.前言 從學習c語言開始就慢慢開始接觸makefile,查閱了很多的makefile的資料但總感覺沒有真正掌握makefile,如果自己動手寫乙個makefile總覺得非常吃力。所以特意借助部落格總結makefile的相關知識,通過例子說明makefile的具體用法。例說makefile索引博文 ...

Make File符號說明

用途define 定義乙個 資料報 是用enddef做結尾,可以包含多行的命令。ifeq ifneq 條件判斷,可以搭配else使用,endif結尾。原型 ifeq arg1,arg2 ifdef ifndef 變數是否定義的條件判斷,可以搭配else使用,endif結尾。原型 ifdef var。...

makefile編寫說明

1.定義 makefile是通過制定規則來編譯程式的乙個指令碼而已。在linux中使用make命令來執行makefile檔案。2.命名 makefile或makefile,若是指定其他名稱。如 makefile.可以這樣使用make f makefile或make clean f makefile ...