編譯的過程
1须眷、編譯流程:
預(yù)處理 -> 編譯 -> 鏈接 -> 執(zhí)行
預(yù)處理
clang -E replay.c > replay.i
編譯 分為兩步:
1、生成匯編文件
clang -S replay.i [自動生成replay.s 匯編文件]
2沟突、根據(jù)匯編文件生成目標(biāo)文件
clang -c replay.s [自動生成replay.o 目標(biāo)文件]
鏈接
clang replay.o -o replay [replay 就是最終的可執(zhí)行的文件]
執(zhí)行
./replay
命令可選項(xiàng)的解釋:
//預(yù)處理
-E
// 操作之后輸出的文件名字
-o <file> Write output to <file>
// 編譯生成匯編文件
-S Only run preprocess and compilation steps
// 編譯成object file (目標(biāo)文件)
-c compile
2花颗、簡單的編譯命令:
clang replay.c //生成 a.out
clang replay.c -o replay //生成 replay可執(zhí)行文件
3、make 工具
根據(jù)時間戳進(jìn)行判斷惠拭,是否重新編譯扩劝。
make clean
聲明變量庸论,引用變量是$(var)
CC 是內(nèi)置變量,表示使用的編譯器命令
CFLAGES 是內(nèi)置變量棒呛,表示編譯選項(xiàng)
CFLAGES+=-c -Wall -g
OBJS=main.o tool1.o tool2.o
mytool:$(OBJS)
在當(dāng)前某一行實(shí)現(xiàn)上聂示,依賴的文件〈孛耄可以用下面的符號$^來表示
當(dāng)前行的目標(biāo)名鱼喉,使用$@ 來表示。
第一個版本
OBJS=main.o tool1.o tool2.o //定義變量
CC=gcc #CC是內(nèi)置變量趋观,一般是指向編譯器命令gcc扛禽,但是我們可以更改該變量
CFLAGS+=-c -Wall -g #CFLAGS也是內(nèi)置變量,可以通過+=的方式在不改變默認(rèn)值的基礎(chǔ)上添加自己想要的編譯選項(xiàng)
#target:依賴文件
#下面一行是是tab符號開始皱坛,表示編譯的命令
mytool:$(OBJS)
$(CC) $^ $(CFLAGS) -o $@
main.o:main.c
$(CC) $^ $(CFLAGS) -o $@
tool1.o:tool1.c
$(CC) $^ $(CFLAGS) -o $@
tool2.o:tool2.c
$(CC) $^ $(CFLAGS) -o $@
#可以在命令中執(zhí)行make clean RM= rm -f
clean:
$(RM) *.o mytool -r
縮減
//提取公式:
XX.o:XX.c
$(CC) $^ $@
同一句話中%代表同一個名字,%是通配符的概念
OBJS=main.o tool1.o tool2.o #定義變量
CC=gcc #CC是內(nèi)置變量编曼,一般是指向編譯器命令gcc,但是我們可以更改該變量
CFLAGS+=-c -Wall -g #CFLAGS也是內(nèi)置變量麸恍,可以通過+=的方式在不改變默認(rèn)值的基礎(chǔ)上添加自己想要的編譯選項(xiàng)
#target:依賴文件
#下面一行是是tab符號開始,表示編譯的命令
mytool:$(OBJS)
$(CC) $^ $(CFLAGS) -o $@
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
#可以在命令中執(zhí)行make clean RM= rm -f
clean:
$(RM) *.o mytool -r # *代表文件夾中的所有子文件
% 號講解:
*代表當(dāng)前目錄下所有搀矫,%類似于一個宏是從前一個目標(biāo)帶入時才用的抹沪,會用帶入的值替換掉%f
makefile講解