標籤:makefie android gcc
Makefile是什嗎?
makefile的作用:
1、工程檔案組織,編譯成複雜的程式
2、安裝及卸載我們的程式
Makefile使用樣本
在/home/username/makefile目錄下有如下三個檔案:
main.c
#include <stdio.h>#include <stdlib.h>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 <stdio.h>int func1(int x, int y){ return x + y;}func2.c
#include <stdio.h>int func2(int x, int y){ return x + y;}下面我們開始編譯上面的檔案:
寫好的Makefile檔案如下:
obj=main.c func1.c func2.chello2:$(obj) gcc $^ -o [email protected].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檔案
這樣做的好處就是在我們換編譯器的時候非常方便。
下面我們來看看makefile中的自動變數及環境變數:
$*_______不包含副檔名的目標檔案名稱
$<_______第一個依賴檔案名稱
$?_______所有時間戳記比目標檔案晚的依賴檔案
[email protected]______目標檔案完整名稱
$^_______所有不重複的依賴檔案
這個時候我們應該清楚了剛開始寫的那個Makefile檔案的內容了
上面還對偽目標進行了聲明(.PHONY)這樣做的目的是為了避免和其他檔案同名衝突。
Android系統開發(3)——Makefile的編寫