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