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

來源:互聯網
上載者:User

標籤: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的編寫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.