linux和Android的Makefile和android.mk


1. makefile

1.1 gcc的參數

-Wall: 是打開警告開關,

-O:    代表默認優化,可選:-O0不優化,-O1低級優化,-O2中級優化,-O3高級優化,-Os代碼空間優化。

-g:     是生成調試信息,生成的可執行文件具有和源代碼關聯的可調試的信息。 

-I(大寫的i):代表后面跟的目錄為第一個尋找頭文件的目錄

-L:     代表后面跟的目錄為第一個尋找庫文件的目錄

-l(小寫的L):表示libxxx.so庫文件

-static:  靜態編譯的

 

舉例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面這句表示在編譯hello.c時:

-I /home/hello/include表示將/home/hello/include目錄作為第一個尋找頭文件的目錄,尋找的順序是:/home/hello/include-->/usr/include-->/usr/local/include -L /home/hello/lib表示將/home/hello/lib目錄作為第一個尋找庫文件的目錄,尋找的順序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib -lworld表示在上面的lib的路徑中尋找libworld.so動態庫文件(如果gcc編譯選項中加入了“-static”表示尋找libworld.a靜態庫文件)

 

-c(小寫):    只編譯,不鏈接

-C(大寫):   切換到指定目錄再執行 make 過程,makefile 在這個指定目錄里面,然后返回到當前目錄繼續讀入、執行當前的Makefile。

 

2. android.mk

2.1 基本概念

可以生成一下幾個類別:

JAVA代碼的 C/C++代碼的
JAR包 二進制可執行文件:ELF (BUILD_EXECUTABLE)
應用程序:APK 動態庫:.so           (BUILD_SHARED_LIBRARY)
  靜態庫:.a                (BUILD_STATIC_LIBRARY)

 

常用的變量:

名字
含義 常用的方式
LOCAL_PATH
當前模塊的相對路徑 LOCAL_PATH := $(call my-dir)
LOCAL_MODULE
編譯生成的目標名稱 LOCAL_MODULE := test
  LOCAL_SRC_FILES 編譯該模塊需要的源文件 LOCAL_SRC_FILES := test.c
 LOCAL_C_INCLUDES
 包含C的頭文件目錄  
 LOCAL_SHARED_LIBRARIES  導入共享庫  LOCAL_SHARED_LIBRARIES += liblog
     

 

2.2 C/C++可執行文件(ELF)

hejin@desk-ubuntu:/home/desk/myandroid$ ls external/test/
Android.mk  test2.c  test2.h  test.c

 

分別查看四個源文件的內容:

hejin@desk-ubuntu:/home/desk/myandroid$ cat external/test/test.c
#include <stdio.h>
#include "test2.h"
int main(){
        printf("hello world\n");
        test2();
        return 0;
}

 

hejin@desk-ubuntu:/home/desk/myandroid$ cat external/test/test2.c
#include<stdio.h>

void test2(){
        printf("hello test2\n");
}

 

hejin@desk-ubuntu:/home/desk/myandroid$ cat external/test/test2.h void test2();

Android.mk:

hejin@desk-ubuntu:/home/desk/myandroid$ cat external/test/Android.mk
LOCAL_PATH := $(call my-dir)      #定義了當前模塊的相對路徑
include $(CLEAR_VARS)             #清空當前環境變量, 除了LOCAL_PATH
LOCAL_MODULE := test              #編譯生成的目標名稱
LOCAL_SRC_FILES := test.c \       #編譯該模塊需要的源文件
                   test2.c
include $(BUILD_EXECUTABLE)       #編譯所生成的目標文件格(在這里是可執行文件)

 

編譯:

1. source build/envsetup.sh

2. lunch

3.

hejin@desk-ubuntu:/home/desk/myandroid$ mmm external/test/
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1.1
TARGET_PRODUCT=sabresd_6dq
TARGET_BUILD_VARIANT=user
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a9
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.16.0-30-generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=2.1.0-ga-rc3
OUT_DIR=out
============================================
No private recovery resources for TARGET_DEVICE sabresd_6dq
make: Entering directory `/home/desk/myandroid'
target thumb C: test <= external/test/test.c
target thumb C: test <= external/test/test2.c
target Executable: test (out/target/product/sabresd_6dq/obj/EXECUTABLES/test_intermediates/LINKED/test)
target Symbolic: test (out/target/product/sabresd_6dq/symbols/system/bin/test)    
target Strip: test (out/target/product/sabresd_6dq/obj/EXECUTABLES/test_intermediates/test)
Install: out/target/product/sabresd_6dq/system/bin/test    //將可執行文件安裝到這個目錄下 make: Leaving directory `/home/desk/myandroid'

#### make completed successfully (1 seconds) ####

 查看文件類型:(可以看出來最后為ELF的可執行文件類型)

hejin@desk-ubuntu:/home/desk/myandroid$ file  out/target/product/sabresd_6dq/system/bin/test
out/target/product/sabresd_6dq/system/bin/test: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), stripped

 

2.3 C/C++可執行程序(ELF)在android下運行

1.將上面的程序從Linux拿到Windows下

 

2. 放入android系統中

 

 

3. 進入android系統執行

 

 

2.4 C/C++動態庫和靜態庫

1. 靜態庫

hejin@desk-ubuntu:/home/desk/myandroid/external/test2$ cat Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := src/test.c \
                src/test2.c
include $(BUILD_STATIC_LIBRARY)

 

hejin@desk-ubuntu:/home/desk/myandroid/external/test2$ mmm .
。。。省略。。。
No private recovery resources for TARGET_DEVICE sabresd_6dq
make: Entering directory `/home/desk/myandroid'
Import includes file: out/target/product/sabresd_6dq/obj/STATIC_LIBRARIES/libtest_intermediates/import_includes
target thumb C: libtest <= external/test2/./src/test.c
target thumb C: libtest <= external/test2/./src/test2.c
Export includes file: external/test2/./Android.mk -- out/target/product/sabresd_6dq/obj/STATIC_LIBRARIES/libtest_intermediates/export_includes
target StaticLib: libtest (out/target/product/sabresd_6dq/obj/STATIC_LIBRARIES/libtest_intermediates/libtest.a)
make: Leaving directory `/home/desk/myandroid'

 

2. 動態庫

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := src/test.c \
                src/test2.c
include $(BUILD_SHARED_LIBRARY)

 

2.5 添加頭文件,系統庫,第三方庫,靜態庫

 

2.6 編譯JAVA(未寫)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM