Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android系統開發(3)——Makefile的編寫

Android系統開發(3)——Makefile的編寫

編輯:關於Android編程

Makefile是什麼?

makefile的作用:

1、工程文件組織,編譯成復雜的程序

2、安裝及卸載我們的程序

Makefile使用示例

在/home/username/makefile目錄下有如下三個文件:

\

main.c

<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD48cHJlIGNsYXNzPQ=="brush:java;">#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.c
hello2:$(obj)
        gcc $^ -o $@
.PHONY:clean
clean:
        rm hello2
install:
        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 hello
main.o:main.c
        gcc -c main.c
func1.o:func1.c
        gcc -c func1.c
func2.o:func2.c
        gcc -c func2.c
seo8L3A+PHA+PHByZSBjbGFzcz0="brush:java;">hello:main.o func1.o func2.o gcc main.o func1.o func2.o -o hello main.o:main.c gcc -c main.c func1.o:func1.c gcc -c func1.c func2.o:func2.c gcc -c func2.c clean: rm func1.o func2.o main.oclean就是一個偽目標,不會生成新的文件,下面我們來執行一下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.o
hello:$(MObj)
        gcc $(MObj) -o hello
main.o:main.c
        gcc -c main.c
func1.o:func1.c
        gcc -c func1.c
func2.o:func2.c
        gcc -c func2.c

clean:
        rm $(MObj) 
install:
        cp hello /usr/local/hello
uninstall:
        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中的自動變量及環境變量:

$*_______不包含擴展名的目標文件名稱

$<_______第一個依賴文件名稱

$?_______所有時間戳比目標文件晚的依賴文件

$@______目標文件完整名稱

$^_______所有不重復的依賴文件

這個時候我們應該清楚了剛開始寫的那個Makefile文件的內容了


上面還對偽目標進行了聲明(.PHONY)這樣做的目的是為了避免和其他文件同名沖突。


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved