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 ;
}
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.
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.--generic-x86_64-with-Ubuntu-14.04-trusty
HOST_BUILD_TYPE=release
BUILD_ID=2.1.-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 ( 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 -bit LSB shared object, ARM, EABI5 version (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(未写)
linux和Android的Makefile和android.mk的更多相关文章
- 3.android下Makefile编写规范
随着移动互联网的发展,移动开发也越来越吃香了,目前最火的莫过于android,android是什么就不用说了,android自从开源以来,就受到很多人的追捧.当然,一部人追捧它是因为它是Google开 ...
- Android NDK开发指南---Application.mk文件和android.mk文件
https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...
- Android NDK 学习之Android.mk
Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk ...
- Android NDK开发之Android.mk文件
Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南 Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...
- Android之makefile
在Android的源代码中,随处可见Makefile,那么Makefile到底是用来干嘛的呢?其实Makefile和Maven.ANT.Gradle一样,属于构建工具,当项目比较庞大的时候,就可以使用 ...
- Linux下命令行安装配置android sdk
首先, 你得有个VPN 参考以下三篇完成Android SDK的安装 https://www.digitalocean.com/community/tutorials/how-to-build-and ...
- android开发学习---linux下开发环境的搭建&& android基础知识介绍
一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...
- 编译 Linux 3.5 内核烧写 Android 4.2.2 到 Tiny4412 开发板
. . . . . 昨天已经编译了 Android 4.2.2 的源码,详见<Ubuntu 14.04 编译 Android 4.2.2 for Tiny4412>一文. 今天我们继续剩下 ...
- 在Linux下adb连接不上android手机的终极解决方案
转自: http://blog.csdn.net/liuqz2009/article/details/7942569 1.做android开发的过程,碰到了Linux下adb识别不了android设备 ...
随机推荐
- [node.js]express+mongoose+mongodb的开发笔记
时间过得很快,6月和7月忙的不可开交,糟心的事儿也是不少,杭州大连来回飞,也是呵呵. 希望下个阶段能沉浸下来,接着学自己想学的.记一下上几周用了几天时间写的课设.因为课设的缘故,所以在短时间里了解下e ...
- [javascript][翻译]使用javascript添加css rule
来杭一周,收获很多,成长很多. 周六在搞一个插件的时候碰到需要动态添加伪元素的需求,搜了一下解决方案,有人用正则写出了读取伪元素的函数:我觉得倒是可以通过注入css rule的方式,来让预留有某些类的 ...
- layou split 属性
layou split:true - 显示侧分栏
- 用canvas画布画一个画板
前段时间,在对H5的回顾中突然对canvas有了感觉,闲来无事便对其进行了一些捯饬.这不,上周我还做了一个好玩的画板呢,废话不多说,直接上代码(PS:翠花,上代码~): HTML部分: <!DO ...
- ie兼容placeholder效果
转载:http://www.jb51.net/article/56244.htm placeholder是HTML5<input>的属性之一,在不同的浏览器( 支持HTML5的现代浏览器 ...
- DS博客作业01--日期抽象数据类型
1.思维导图及学习体会(2分) 1.1第一章绪论知识点思维导图 1.2学习体会 从暑假看视频到开学的预习,我感觉数据结构与c语言比起来更加抽象,更加难理解,那些概念也只能理解一些字面意思,对时间复杂度 ...
- ClamAV学习【9】——cvd文件解析及cli_untgz函数浏览
这个cli_untgz函数,是用来解压CVD文件的. 那么,就刚先搞清楚CVD文件的功能作用.下了源码,我们会发现,没有前面提到的*.mdb或者*.hbd等病毒签名文件.原因就是,那些文件都是由CVD ...
- UnSafe类中的一些重要方法
UnSafe类中的一些重要方法 JDK中的rt.jar保重Unsafe类中提供了硬件级别的原子性操作,Unsafe类中的方法都是navtice方法,他们使用JNI的方式访问C++实现库,下面我们来了解 ...
- JSONP前世今生及原理
https://blog.csdn.net/hansexploration/article/details/80314948 http://www.cnblogs.com/yuzhongwusan/a ...
- ObjectARX动态添加AutoCAD传统下拉菜单入门篇(一)
ObjectARX动态添加传统下拉菜单入门篇 图文by edata , 转载注明出处 http://www.cnblogs.com/edata AutoCAD 添加传统下拉菜单有很多种方式,比较典型 ...