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

Makefile是什麼?

makefile的作用:

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

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

Makefile使用示例

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

main.c

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main(int argc, char *argv[]){  
  5.         int x, y;  
  6.         sscanf(argv[1], "%u", &x);  
  7.         sccanf(argv[2], "%u", &y);  
  8.         printf("func1:%u\n", func1(x, y));  
  9.         printf("func2:%u\n", func2(x, y));  
  10.   
  11.         return 0;  
  12. }  
func1.c

  1. #include <stdio.h>  
  2.   
  3. int func1(int x, int y){  
  4.         return x + y;  
  5. }  
func2.c

  1. #include <stdio.h>  
  2.   
  3. int func2(int x, int y){  
  4.         return x + y;  
  5. }  
下面我們開始編譯上面的文件:

寫好的Makefile文件如下:

  1. obj=main.c func1.c func2.c  
  2. hello2:$(obj)  
  3.         gcc $^ -o $@  
  4. .PHONY:clean  
  5. clean:  
  6.         rm hello2  
  7. install:  
  8.         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命令來生成。

  1. #建立第一個Makefile文件  
  2. hello:main.c func1.c func2.c  
  3.         gcc main.c func1.c func2.c -o hello  
我們來修改一下上面的Makefile

  1. #建立第二個Makefile文件  
  2. hello:main.o func1.o func2.o  
  3.         gcc main.o func1.o func2.o -o hello  
  4. main.o:main.c  
  5.         gcc -c main.c  
  6. func1.o:func1.c  
  7.         gcc -c func1.c  
  8. func2.o:func2.c  
  9.         gcc -c func2.c  

發現不僅生成了hello而且多了幾個func1.c func1.o func2.c func2.o main.c main.o文件,下面我們修改一下Makefile文件,添加一個僞目標

  1. hello:main.o func1.o func2.o  
  2.         gcc main.o func1.o func2.o -o hello  
  3. main.o:main.c  
  4.         gcc -c main.c  
  5. func1.o:func1.c  
  6.         gcc -c func1.c  
  7. func2.o:func2.c  
  8.         gcc -c func2.c  
  9.   
  10. clean:  
  11.         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

  1. MObj = main.o func1.o func2.o  
  2. hello:$(MObj)  
  3.         gcc $(MObj) -o hello  
  4. main.o:main.c  
  5.         gcc -c main.c  
  6. func1.o:func1.c  
  7.         gcc -c func1.c  
  8. func2.o:func2.c  
  9.         gcc -c func2.c  
  10.   
  11. clean:  
  12.         rm $(MObj)   
  13. install:  
  14.         cp hello /usr/local/hello  
  15. uninstall:  
  16.         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)這樣做的目的是爲了避免和其他文件同名衝突。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章