(P3)Linux開發工具—Makefle上

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
  • 測試:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章