典型的makefile規(guī)則如下,參考howto_makefiles
- target 通常是程序所生成的文件的名字,類型如可執(zhí)行文件或目標文件(.o)
- dependency是用來創(chuàng)建目標文件的依賴文件,target會依賴好幾個這樣的文件
- command 是make所要執(zhí)行的命令,可能有多個,每個命令都必須以tab鍵開頭
target :dependency1 dependency2 ...
command
#使用目標文件program.o和mylib.o生成可執(zhí)行文件program
program: program.o mylib.o
gcc -o program program.o mylib.o
單個文件的編譯很簡單
myprog : myprog.c
gcc -g -Wall -o myprog myprog.c
規(guī)則很簡單,但上面的只能針對具體的文件,不夠通用,我們可以簡單泛化,對于單個文件,只要配置TARGET 為源文件名稱即可
# 使用參數(shù)配置編譯器, gcc for C , g++ for C++
CC = gcc
# 編譯參數(shù)設置:
# -g 在可執(zhí)行文件中添加調(diào)試信息
# -Wall 盡可能多的顯示編譯警告
CFLAGS = -g -Wall
# 最終可執(zhí)行的目標文件,
TARGET = myprog
$(TARGET): $(TARGET).c
$(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c
但實際中開發(fā)很少是單文件編譯,下面看如何使用多個源文件編譯,其實本質(zhì)和蓋樓一樣,每一步依賴之前的產(chǎn)出,比如創(chuàng)建一個可執(zhí)行文件 count 我們需要三個目標文件countwords.o, counter.o, 和 scanner.o:
count: countwords.o counter.o scanner.o
$(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o
目標文件countwords.o如果不存在,也是需要從源文件編譯生成的 ,假如是 countwords.c, scanner.h, and counter.h:
countwords.o: countwords.c scanner.h counter.h
$(CC) $(CFLAGS) -c countwords.c
同理,counter.o scanner.o也是這個思路
counter.o: counter.c counter.h
$(CC) $(CFLAGS) -c counter.c
scanner.o: scanner.c scanner.h
$(CC) $(CFLAGS) -c scanner.c
合在一起就是多文件編譯生成最終可執(zhí)行文件count,這種寫法和我們手動編譯是反者的,它是從結(jié)果找條件,手動編譯的先創(chuàng)造條件最終生成結(jié)果。了解規(guī)則以后,寫起來就很容易
count: countwords.o counter.o scanner.o
$(CC) $(CFLAGS) -o count countwords.o counter.o scanner.o
countwords.o: countwords.c scanner.h counter.h
$(CC) $(CFLAGS) -c countwords.c
counter.o: counter.c counter.h
$(CC) $(CFLAGS) -c counter.c
scanner.o: scanner.c scanner.h
$(CC) $(CFLAGS) -c scanner.c
由于makefile只能有一個目標,當TARGET有多個目標文件時,可以構(gòu)造一個沒有規(guī)則的終極目標all,并以冒號后面的文件作為依賴
all:main1 main2
main1: main1.c
gcc main1.c -o main1
main2: main2.c
gcc main2.c -o main2