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(未寫)