1. 程式人生 > >Makefile和Android.mk的基情

Makefile和Android.mk的基情

Makefile

Makefile介紹

make 是一個命令工具,它解釋 Makefile 中的指令(應該說是規則) 。在 Makefile
檔案中描述了整個工程所有檔案的編譯順序、編譯規則。Makefile 有自己的書寫格式、
關鍵字、函式。像 C 語言有自己的格式、關鍵字和函式一樣。而且在 Makefile 中可以
使用系統 shell 所提供的任何命令來完成想要的工作。Makefile(在其它的系統上可能
是另外的檔名)在絕大多數的 IDE 開發環境中都在使用,已經成為一種工程的編譯
方法。

Makefile三要素:目標,依賴,命令

  • 目標:目標分為最終目標(第一行就是最終目標)
  • 依賴: 目標符號”:”後的都是依賴
  • 命令:gcc為命令,他是GNU編譯器,用於c/c++等編譯

    • GCC最基本的用法是∶gcc [options] [filenames] 其中options就是編譯器所需要的引數,filenames給出相關的檔名稱。

    • -c,只編譯,不連結成為可執行檔案,編譯器只是由輸入的.c等原始碼檔案生成.o為字尾的目標檔案,通常用於編譯不包含主程式的子程式檔案。

    • -o output_filename,確定輸出檔案的名稱為output_filename,同時這個名稱不能和原始檔同名。如果不給出這個選項,gcc就給出預設的可執行檔案a.out。
#step 1
#myapp:main.o func.o # gcc main.o func.o -o myapp #目標:main.o .o為字尾的檔案,是編譯後的目標檔案; #依賴:main.c .c為字尾的檔案,C語言原始碼檔案; #命令:gcc -c main.c #main.o:main.c # gcc -c main.c #func.o:func.c # gcc -c plus.c

Makefile變數和簡單運算(程式碼複製自別處)

#變數
#OBJECTS=main.o func.o add.o multi.o

#step 3
#所有.c原始檔
SOURCES=$(wildcard *.c)
#把.c字尾,替換成.o字尾
OBJECTS=$(patsubst %.c,%.o,$(SOURCES)) myapp:$(OBJECTS) #自動化變數 $^表示所有依賴,[email protected]表示目標 gcc $^ -o [email protected] #萬用字元 #main.o:main.c %.o:%.c #gcc -c main.c -o main.o gcc -c $^ -o [email protected] #clean清除所有的.o中間檔案 #偽目標 .PHONY:clean clean: rm -f *.o rm -f myapp #遞迴展開式 #可以引用還沒有定義的變數,展開是引用時展開 str2=$(str1) str1=hello #直接展開式 #必須引用定義好了的變數,定義之後就會展開 str3 := android str4 := $(str3) str5 := $(str1) world #變數的值追加 str5 += hello #自定義函式 myfun=$2 $1 #變數等於函式的執行結構 myfun_ret=$(call myfun,20,10) test: @echo $(SOURCES) @echo $(OBJECTS) @echo $(str2) @echo $(str4) @echo $(str5) @echo $(myfun_ret) @echo $(call myfun,30,40)

Android.mk

學習小例子


    LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)
#模組名稱
   LOCAL_MODULE    := hello-jni
#編譯時所需原始檔
   LOCAL_SRC_FILES := hello-jni.c
#需要的標頭檔案
   LOCAL_C_INCLUDES += $(LOCAL_PATH)/include/ffmpeg
   include $(BUILD_SHARED_LIBRARY)
  • LOCAL_PATH := $(call my-dir)

    可檔案必須首先LOCAL_PATH變數的定義。
    它是用來定位在開發樹的原始檔。在這個例子中,巨集函式“my-dir”,提供的構建系統,用於返回
    當前目錄的路徑(即包含Android的目錄。可檔案本身)。

  • include $(CLEAR_VARS)

CLEAR_VARS變數提供的構建系統,指出了一個特殊的GNU Makefile,會清楚很多LOCAL_XXX變數
(例如LOCAL_MODULE,LOCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等…),除了LOCAL_PATH。這是必要的,因為所有的構建
控制檔案解析一個GNU使執行上下文,所有變數都是全域性的。

  • LOCAL_MODULE := hello-jni

LOCAL_MODULE變數必須定義來確定每個模組你在Android.mk描述。名稱必須獨特* *和不包含
任何空間。注意,構建系統將自動新增適當的字首和字尾生成相應的檔案。換句話說,
共享庫模組命名“foo”將生成“libfoo.so”。

  • LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES變數必須包含將要打包如模組的C/C++ 原始碼。不必列出標頭檔案,build System 會自動幫我們找出依賴檔案。
預設的C++原始碼的副檔名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。

  • include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY:是Build System提供的一個變數,指向一個GNU Makefile Script。它負責收集自從上次呼叫 include $(CLEAR_VARS) 後的所有LOCAL_XXX資訊。並決定編譯為什麼。

BUILD_STATIC_LIBRARY:編譯為靜態庫。

BUILD_SHARED_LIBRARY :編譯為動態庫

BUILD_EXECUTABLE:編譯為Native C可執行程式

授人以漁

關於Android.mk,我只是小作介紹
如果英文尚可,請直接翻閱,理解,繼續學習.
http://android.mk/
另外,也可在ndk目錄下尋找官方文件
例如 E:\android-ndk-r9d\docs中
Makefile語法介紹相關文件可百度

參考

相關推薦

MakefileAndroid.mk

Makefile Makefile介紹 make 是一個命令工具,它解釋 Makefile 中的指令(應該說是規則) 。在 Makefile 檔案中描述了整個工程所有檔案的編譯順序、編譯規則。Makefile 有自己的書寫格式、 關鍵字、函式。像 C

Android NDK-0.ndk-build的Android.mkAndroid.mk簡介

文章目錄 ndk-build是什麼 ndk-build如何使用 什麼是Android.mk LOCAL_PATH CLEAR_VARS LOCAL_MODULE LOCAL_CFLAGS

android編譯系統的makefile檔案Android.mk寫法如下

(1)Android.mk檔案首先需要指定LOCAL_PATH變數,用於查詢原始檔。由於一般情況下 Android.mk和需要編譯的原始檔在同一目錄下,所以定義成如下形式: LOCAL_PATH:=$(call my-dir) 上面的語句的意思是將LOCAL_PATH變數

makefileandroid.mk中加列印資訊

makefile裡面加列印: [table]@echo ' zImage - Compressed kernel image'  android.mk裡面加列印資訊: $(warning TEXT......) 這個函式被執行的時候,會輸出:TEXT......,但是make會繼續執行下去。

Android.mk添加本地程序庫的經常使用模版

size 例如 center 配置文件 clear hello main 解釋 共享 Android.mk添加本地程序和庫的經常使用模版 Android中添加本地程序或者庫。這些程序和庫與其所在路徑沒有關系。僅僅與它們的配置文件Android.mk有關。Androi

uboot主Makefile之11——源碼目錄下mkconfigconfig.mk文件的區別

config 腳本 color gpo blog log efi con clas 首先mkconfig文件是在uboot編譯前配置時運行的,即當我們make x210_sd_config時,會在主Makefile文件的第2589行 運行mkconfig這個腳本程序,並且會

Android NDK學習(二):編譯腳本語法Android.mkApplication.mk

GC make files 文件的 包括 一次 opengl aries 基本語法 一、Android.mk Android.mk分為一下幾部分: LOCAL_PATH:= $(call my-dir), 返回當前文件在系統中的路徑,Android.mk文件開始時必須定義

android makefile android mk 分析 1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android.mk 語法變數介紹

一、簡介 Android.mk 是一種指令碼語言,是將 C/C++ 原始檔粘合至 NDK 的構建檔案。 官網對 Android.mk 的介紹:https://developer.android.com/ndk/guides/android_mk 二、一些超級基本的語法 例如我

Android.mk的用法基礎 && m、mm、mmm編譯命令

Android.mk的用法和基礎 && m、mm、mmm編譯命令         一個Android.mk file用來向編譯系統描述你的原始碼。具體來說:該檔案是GNU Makefile的一小部分,會被編譯系統解析一次或多次。你可以在每一個Androi

Android.mk 中的靜態庫共享庫

有些類似的問題碰到過很多次,但大腦裡總是各種碎片化的記憶,長時間記住這些碎片並不是人類大腦的強項,所以有事沒事就要捋捋,知道前因後果才 能記憶深刻。 Android.mk Android.mk 只是GNU Makefile的一小部分,用來編譯modul

android.mk 詳解 其他makefile檔案類似

關於libs資料夾和obj資料夾 obj下的是帶符號和除錯資訊的,所以就大很多,靜態庫也在這個裡面。lib下的是就去去掉這些龐大資訊後的庫檔案,而且是動態連結的庫。 方便在Android.mk中定義自己的變數,我們建議使用MY_字首 一、單個android.mk檔案

Makefile & Android.mk檔案

1. 列印輸出:$(warning xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)或者$(error xxxxx) 列印輸出變數的值:$(warning  $(LOCAL_SHARED_LIBRARIES)) 2. LOCAL_CFLAGS

Android.mk中LOCAL_SHARED_LIBRARIESLOCAL_LDLIBS的區別

對比Linux開發,Android開發讓我注意到了一些在Linux開發中認為理所當然的知識。這次遇到了一個連結庫的問題。 程式碼中加入了log列印,編譯時出現__android_log_print找不到的問題,需要連結庫,網上搜了搜需要連結libutils、libcutil

android makefile 編譯分析及 android.mk分析

下面是main.mk檔案包含關係,本文件主要說明的就是這些檔案裡到底做了什麼。(這個檔案被根目錄下的makefile檔案包含) 一. main.mk 1.檢查版本號,設定環境變數(BUILD_SYSTEM)和預設的目標。$(MAKE_VER

Android mkApplication mk文件語法規範說明及舉例

form lac run ipp man agg rom mes ica 以下英文內容摘自:http://www.kandroid.org/ndk/docs/OVERVIEW.htmlThe Android NDK is a set of tools that allow

NDK 編譯使用靜態庫、動態庫; Android.mk 檔案語法詳解; Android.mk高階寫法

===================================================================================== 0. Android.mk簡介: Android.mk檔案用來告知NDK Build 系統關於Source的資訊。 Andro

aar與source.jar,aar檔案jar檔案區別,以及Android.mk如何引用aar檔案jar檔案

1,aar與source.jar的區別   原文地址:http://blog.csdn.net/csdn_yudong/article/details/48090535 關於.jar與sources.jar到底是什麼,區別是什麼,我為大家講解一下。 首先,當我們在下

利用makefile的語法功能,檢視AndroidAndroid.mk裡面的變數的值

$(warning  "/nthe value of BOARD_USE_PMEM_TO_SIMULATE_BMM $(BOARD_USE_PMEM_TO_SIMULATE_BMM)")ifeq ($(BOARD_USE_PMEM_TO_SIMULATE_BMM), true)LOCAL_SRC_FILES

Android 基於 MVP 框架的下拉重新整理、上拉載入頁面,ViewPresenter層類封裝

前言 Android 專案開發中經常遇到列表式頁面,並且需要實現下拉重新整理,上拉到底後加載下一頁的功能,這裡結合我們專案正在使用的 MVP 框架,介紹一種基類封裝方案,實現 View、Adapter、資料處理Presenter層的基類封裝,後續繼承這幾個類,