Android系統開發(3)——Makefile的編寫
Makefile是什嗎?
makefile的作用:
1、工程檔案組織,編譯成複雜的程式
2、安裝及卸載我們的程式
Makefile使用樣本
在/home/username/makefile目錄下有如下三個檔案:
main.c
#include #include int main(int argc, char *argv[]){ int x, y; sscanf(argv[1], "%u", &x); sccanf(argv[2], "%u", &y); printf("func1:%u\n", func1(x, y)); printf("func2:%u\n", func2(x, y)); return 0;}func1.c
#include int func1(int x, int y){ return x + y;}func2.c
#include int func2(int x, int y){ return x + y;}下面我們開始編譯上面的檔案:
寫好的Makefile檔案如下:
obj=main.c func1.c func2.chello2:$(obj) gcc $^ -o $@.PHONY:cleanclean: rm hello2install: cp hello2 /usr/local
運行make
Makefile的編寫規則
Makefile由若干條上面的規則構成,每個規則如下:
taget目標:prequisites(依賴)
command(命令)
注意:第二行必須有一個Tab縮排
例如上面兩行表示要產生目標檔案hello,在產生hello的同時需要依賴main.o func1.o func2.o這三個檔案,並且執行gcc main.o func1.o func2.o -o hello命令來產生。
#建立第一個Makefile檔案hello:main.c func1.c func2.c gcc main.c func1.c func2.c -o hello
我們來修改一下上面的Makefile
#建立第二個Makefile檔案hello:main.o func1.o func2.o gcc main.o func1.o func2.o -o hellomain.o:main.c gcc -c main.cfunc1.o:func1.c gcc -c func1.cfunc2.o:func2.c gcc -c func2.c
發現不僅產生了hello而且多了幾個func1.c func1.o func2.c func2.o main.c main.o檔案,下面我們修改一下Makefile檔案,添加一個偽目標
hello:main.o func1.o func2.o gcc main.o func1.o func2.o -o hellomain.o:main.c gcc -c main.cfunc1.o:func1.c gcc -c func1.cfunc2.o:func2.c gcc -c func2.cclean: rm func1.o func2.o main.o
clean就是一個偽目標,不會產生新的檔案,下面我們來執行一下make clean來看一下效果
執行make clean後func1.o func2.o main.o全部刪除了(可以想到卸載程式的原理),下面我們就來添加一個install和uninstall偽目標
在我們執行make install的時候會將我們用到的執行檔案和庫檔案拷貝到指定目錄,在執行uninstall的時候會刪除安裝時的拷貝檔案。
下面我們來使用變數MObj代替main.o func1.o func2.o
MObj = main.o func1.o func2.ohello:$(MObj) gcc $(MObj) -o hellomain.o:main.c gcc -c main.cfunc1.o:func1.c gcc -c func1.cfunc2.o:func2.c gcc -c func2.cclean: rm $(MObj) install: cp hello /usr/local/hellouninstall: rm /usr/local/hello
如果這樣寫MObj := main.o func1.o func2.o 表示不遞迴變數。也可以使用系統的預定義變數,常見的預定義變數如下:
AR_____庫檔案維護程式的名稱,預設值為ar
AS_____組譯工具的名稱,預設值為as
CC_____C編譯器的名稱,預設值為cc
CXX____C++編譯器的名稱,預設值為g++
ARFLAGS_____庫檔案維護程式選項,無預設值
ASFLAGS_____組譯工具選項,無預設值
CFLAGS______C編譯器選項,無預設值
CXXFLAGS____C++編譯器選項,無預設值
下面我們使用預定義變數來改寫一下我們上面的Makefile檔案
這樣做的好處就是在我們換編譯器的時候非常方便。<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD7PwsPmztLDx8C0v7S/tG1ha2VmaWxl1tC1xNfUtq+x5MG/vLC7t76zseTBv6O6PC9wPjxwPiQqX19fX19fX7K7sPy6rMCp1bnD+7XExL+x6s7EvP7D+7PGPC9wPjxwPiQ8X19fX19fX7Xa0ru49tLAwLXOxLz+w/uzxjwvcD48cD4kP19fX19fX1/L+dPQyrG85LTBscjEv7HqzsS8/s3ttcTSwMC1zsS8/jwvcD48cD4kQF9fX19fX8S/serOxLz+zerV+8P7s8Y8L3A+PHA+JF5fX19fX19fy/nT0LK71ti4tLXE0sDAtc7EvP48L3A+PHA+1eK49sqxuvLO0sPH06a4w8fls/7By7jVv6rKvNC0tcTEx7j2TWFrZWZpbGXOxLz+tcTE2sjdwcs8L3A+PHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140825/2014082508533576.png" alt="" />
上面還對偽目標進行了聲明(.PHONY)這樣做的目的是為了避免和其他檔案同名衝突。