一起來寫Makefile
前言:在Linux 系統(tǒng)下編寫 C/C++ 程序,學(xué)習(xí) Makefile 的基礎(chǔ)是非常有必要的,至少需要看懂程序的編譯鏈接過程,才能對(duì)項(xiàng)目有個(gè)整體的認(rèn)識(shí)。當(dāng)然最好是自己能寫 Makefile,本文介紹了 Makefile 的一些基本規(guī)則。
Makefile 的規(guī)則
首先需要了解 Makefile 文件的基本規(guī)則,如下:
按照上面的規(guī)則來寫一個(gè)程序編譯的 Makefile 腳本,如下:
# 井號(hào)是注釋
hello:hello.o
gcc hello.o -o hello # 鏈接
hello.o:hello.S
gcc -c hello.S -o hello.o # 編譯
hello.S:hello.i
gcc -S hello.i -o hello.S # 匯編
hello.i:hello.c
gcc -E hello.c -o hello.i # 預(yù)編譯
.PHONY: # 偽目標(biāo)
clean:
rm hello hello.i hello.S hello.o
示例一
接下來編寫一個(gè)測(cè)試程序 test 的 Makefile 文件,編譯后需要生成一個(gè) test 二進(jìn)制文件。目錄結(jié)構(gòu)如下:
根據(jù)規(guī)則編寫一個(gè)簡單的編譯腳本:
test:main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o test
main.o:main.c
gcc -c main.c -o main.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
div.o:div.c
gcc -c div.c -o div.o
.PHONY:
clean:
rm *.o
cleanall:
rm *.o test
執(zhí)行 make 編譯效果如下:
使用Makefile變量
Makefile 定義變量的幾種符號(hào)含義:?=?替換;?+=?追加;?:=?常量
使用變量后的 Makefile 示例一文件:
CC :=gcc
TAR=test
OBJ=main.o add.o sub.o mul.o div.o
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
main.o:main.c
$(CC) -c main.c -o main.o
add.o:add.c
$(CC) -c add.c -o add.o
sub.o:sub.c
$(CC) -c sub.c -o sub.o
mul.o:mul.c
$(CC) -c mul.c -o mul.o
div.o:div.c
$(CC) -c div.c -o div.o
.PHONY:
clean:
rm $(OBJ)
cleanall:
rm $(OBJ) $(TAR)
Makefile 隱含規(guī)則
%.c?和?%.o?:任意的 .c 文件和 .o 文件
*.c?和 *.o?:所有的 .c 文件和 .o 文件
Makefile 通配符
Makefile 中常見的自動(dòng)變量
| 命令 | 含義 |
|---|---|
| $< | 第一個(gè)依賴文件的名稱 |
| $^ | 所有的依賴文件 |
| $@ | 所有的目標(biāo)文件 |
利用通配符改進(jìn)的示例一
CC :=gcc
TAR=test
OBJ=main.o add.o sub.o mul.o div.o
$(TAR):$(OBJ)
gcc $^ -o $@
%.o:%.c
$(CC) -c $^ -o $@
.PHONY:
clean:
rm $(OBJ)
cleanall:
rm $(OBJ) $(TAR)
評(píng)論
圖片
表情
