歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux開發工具--Makefile(1) 簡單的Makefile規則和Makefile自動變量

linux開發工具--Makefile(1) 簡單的Makefile規則和Makefile自動變量

日期:2017/3/1 12:02:57   编辑:關於Linux

make通過makefile文件來完成並自動維護編譯工作,makefile描述了整個工程的編譯、連接規則。

Makefile基本規則:
TARGET…: DEPENDENCIES …
COMAND

TARGET(目標): 程序產生的文件,如可執行文件和目標文件;目標也可以指要執行的動作,如clean,也稱為偽目標,可以有多個目標或者一個目標,一般只有一個目標。
DEPENDENCIES(依賴):用來產生目標的輸入文件列表,一般一個目標依賴多個文件,。
COMMAND(命令):是make要執行的動作(命令是shell命令或者是可以在shell下執行的程序),注意,每個命令行前面必須有一個TAB字符!

如果DEPENDENCIES中有一個或者多個文件更新的話,COMMAND就要執行,這是Makefile最核心的內容

//創建測試文件
touch main.c add.c add.h sub.c sub.h
//一個簡單的例子
//Makefile
main:main.o sub.o add.o #main是目標文件(TARGET),是要生成的文件,main.o sub.o add.o
#是依賴文件(DEPENDENCIES),如果make發現依賴文件列表中的依賴不存在,就會先執行後面的命令,來生成相應的依賴文件.
        gcc -Wall main.o sub.o add.o -o main#這一句是COMMAND,用來生成TARGET
sub.o:sub.c sub.h
        gcc -Wall -c sub.c -o sub.o
add.o:add.c add.h
        gcc -Wall -c add.c -o add.o
main.o:main.c add.h sub.h
        gcc -Wall -c main.c -o main.o
clean:
        rm -f *.o main


是一條基本的規則和命令
隨後直接執行make,就可以
這裡寫圖片描述
執行make clean:
這裡寫圖片描述

簡單的Makefile就可以完成了<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPiZuYnNwOzwvcD4NCjxwPs6xxL+x6jogyc/D5rXETWFrZWZpbGXOxLz+1tAgY2xlYW7Kx9K7uPbOscS/seqjrNfuusPU2k1ha2VmaWxlzsS8/seww+a808nPIC5QSE9OWTogY2xlYW48L3A+DQo8cD4mbmJzcDs8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> .PHONY:clean main:main.o sub.o add.o gcc -Wall main.o sub.o add.o -o main sub.o:sub.c sub.h gcc -Wall -c sub.c -o sub.o add.o:add.c add.h gcc -Wall -c add.c -o add.o main.o:main.c add.h sub.h gcc -Wall -c main.c -o main.o clean: rm -f *.o main

為什麼我們需要加上.PHONY:clean 顯式指定clean是一個偽目標呢?
1)我們不顯式指定偽目標,並在當前文件夾下創建一個clean文件,並且執行make clean
目錄下的文件:
這裡寫圖片描述
Makefile文件:

這裡寫圖片描述
.PHONY:clean 已經注釋:
執行make clean可看到一下結果
這裡寫圖片描述

這是因為文件夾中有一個clean文件,make認為clean沒有修改過,所以出錯,加上.PHONY:clean之後,這個問題就可以解決
這裡寫圖片描述

現在Makefile基本上可以工作了,但是可以發現,Makefile文件中有好幾處是重復的,我們是否可以將重復的部分定義成一個變量呢?答案是可以的!

Makefile自動化變量:
這裡寫圖片描述

$@:規則的目標文件名,比如說,以上的Makefile文件中
這裡寫圖片描述
這是一條規則,main.o是這條規則的目標文件名,他可以用 $@來表示,即可以表示成:
這裡寫圖片描述
這樣在命令中,main.o 就被$@代替了

$<:規則的第一個依賴文件名,即依賴文件列中中第一個依賴文件,如:
這裡寫圖片描述
上面一條命令中,依賴文件列表時 main.c add.h sub.h,那麼main.c就是依賴文件列表中第一個文件
$< 可以表示main.c。這樣命令可以被表示成:
這裡寫圖片描述

$^表示所有的依賴文件:

現在來定義一個變量:

.PHONY:clean
OBJECT=main.o sub.o add.o
main:$(OBJECT)
        gcc -Wall main.o sub.o add.o -o main
sub.o:sub.c sub.h
        gcc -Wall -c sub.c -o sub.o
add.o:add.c add.h
        gcc -Wall -c add.c -o add.o
main.o:main.c add.h sub.h
        gcc -Wall -c main.c -o main.o
clean:
        rm -f *.o main

上面的Makefile文件中,我們定義了一個變量OBJECT, OBJECT代表了 main.o sub.o add.o這個文件列表
在$()表示引用變量 $(OBJECT) 應用了定義的文件列表,$^表示目標文件列表,這時候我們可以用他來替換main.o sub.o add.o,所以替換之後為:

.PHONY:clean
OBJECT=main.o sub.o add.o
main:$(OBJECT)
        gcc -Wall $^ -o main
sub.o:sub.c sub.h
        gcc -Wall -c sub.c -o sub.o
add.o:add.c add.h
        gcc -Wall -c add.c -o add.o
main.o:main.c add.h sub.h
        gcc -Wall -c main.c -o main.o
clean:
        rm -f *.o main

最後,我們用$@ $^ $< 替換Makefile文件中各部分,替換之後為

.PHONY:clean
OBJECT=main.o sub.o add.o
main:$(OBJECT)
        gcc -Wall $^ -o $@
sub.o:sub.c sub.h
        gcc -Wall -c $< -o $@
add.o:add.c add.h
        gcc -Wall -c $< -o $@
main.o:main.c add.h sub.h
        gcc -Wall -c $< -o $@
clean:
        rm -f $(OBJECT) main

這樣替換就完成了,相比於開始的,就顯得更加專業一些了

Copyright © Linux教程網 All Rights Reserved