1.make與Makefile介紹
- make工具
利用make工具可以自動完成編譯工作。這些工作包括:
(1)如果僅僅修改了某幾個源文件,則只重新編譯這幾個源文件;
(2)如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。
利用這種自動編譯可大大簡化開發工作,避免不必要的重新編譯 - Makefile
make工具通過一個稱爲Makefile的文件來完成並自動維護編譯工作。
Makefile文件描述了整個工程的編譯,連接等規則。
2.Makefile基本規則
- 規則如下
TARGET...:DEPENDENCIES
COMMAND
...
(1)目標TARGET程序產生的文件,如可執行文件和目標文件,中間文件(.s文件);
目標也可以是要執行的動作,如:clean,也稱之爲僞目標
(2)依賴DEPANDENCIES是用來產生目標的輸入文件列表,一個目標通常依賴於多個文件
(3)命令COMMAND是make執行的動作(命令是shell命令或者是可在shell下執行的程序)。
注意:每個命令行的起始字符必須爲TAB字符
(4)如果DEPENDENCIES中有一個或多個文件更新的話,COMMAND就要執行,這就是Makefile最核心的內容
目標文件可以有1個或者多個
依賴文件可以有1個或者多個,也可以沒有
3.簡單的Makefile編寫
- eg1:03make\01
文件夾包含的內容:
只有main.c有代碼,代碼如下:
int main(void)
{
return 0;
}
- Makefile1
.PHONY:clean ##顯示指定clean爲一個僞目標,怕該目錄下有個clean名字的文件,不能編譯
main:main.o add.o sub.o
gcc -Wall -g main.o add.o sub.o -o main
main.o:main.c
gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
gcc -Wall -g -c sub.c -o sub.o
clean:
rm -f main main.o add.o sub.o
- Makefile2
.PHONY:clean
OBJECTS=main.o add.o sub.o
main:$(OBJECTS)
gcc -Wall -g $^ -o $@
main.o:main.c
gcc -Wall -g -c $< -o $@
add.o:add.c add.h
gcc -Wall -g -c $< -o $@
sub.o:sub.c sub.h
gcc -Wall -g -c $< -o $@
clean:
@echo "begin delete ..." ##該語句(echo "begin delete ...")不想打印出來,就在最前面加一個@符號
rm -f main $(OBJECTS)
- 測試Makefile2
(1)如果不加@
(2)加@
make 直接輸入make會執行第一個目標
make main.o make +目標也可以執行,但是隻執行該目標的命令
make makefile Makefile文件名字也可以是makefile
make clean -f Makefile.1 表示用Makefile.1中的規則來執行,指定Makefile文件
4.Make自動化變量
$@ | 規則的目標文件名 |
$< | 規則的第一個依賴文件名 |
$^ | 規則的所有依賴文件列表 |
- eg:見上述03make\01\Makefile2
5.Makefile編譯多個可執行文件
- 模式規則
%.o:%.c
- 後綴規則
.c.o:
- eg:03make\02
(1)目錄如下
(2)文件的內容如下
=========03make\02\01test.c==========
int main(void)
{
return 0;
}
========================
=================03make\02\02test.c===============
int main(void)
{
return 0;
}
======================
pub.c和pub.h都爲空
- Makefile1
.PHONY:clean all
BIN=01test 02test ##直接執行:make Makefile
all:$(BIN) ##all也是僞目標,這裏並沒有給01test,02test是如何生成的,編譯器會自動推導,
clean: ##會將同名的.c文件生成同名的可執行文件,eg:01test.c生成01test
rm -f $(BIN)
- Makefile2
.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g
BIN=01test 02test
all:$(BIN) ##all代表第一個終極目標
%.o:%.c ##將對應的.c文件生成對應的.o文件,等價於.c.o:
$(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
$(CC) $(CFLAGS) $^ -o $@ ##生成可執行文件不需要-c
02test:02test.o pub.o ##若02test還依賴pub模塊(pub.c,pub.h)
$(CC) $(CFLAGS) $^ -o $@
clean:
rm -f $(BIN) *.o
- 測試: