makefile 增加巨集定義

2021-06-28 11:50:43 字數 2883 閱讀 1468

0.前言

從學習c語言開始就慢慢開始接觸makefile,查閱了很多的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 

intmain(

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

其中第一種方法對應

#ifdef

do_something()

#endif

第二種方法對應

#ifndef defines

do_something()

#endif

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=2

a+b=5

a-b=1

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

6.總結

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

巨集定義追加到cflag之後

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

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

Makefile進行巨集定義

實際上是gcc命令支援 d巨集定義,相當於c中的全域性 define gcc d name gcc d name definition makefile中可以定義變數 和巨集很像 但是是給make直譯器用的,對所編譯的檔案完全沒有作用。在makefile中我們可以通過巨集定義來控制源程式的編譯。只要...

Makefile 巨集定義 D

一 gcc編譯器中使用 d macro string,等價於在標頭檔案中定義 define macro string。例如 d true true,等價於 define true true d macro,等價於在標頭檔案中定義 define macro 1,實際上也達到了定義 define mac...