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的更多相关文章

  1. 3.android下Makefile编写规范

    随着移动互联网的发展,移动开发也越来越吃香了,目前最火的莫过于android,android是什么就不用说了,android自从开源以来,就受到很多人的追捧.当然,一部人追捧它是因为它是Google开 ...

  2. Android NDK开发指南---Application.mk文件和android.mk文件

    https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...

  3. Android NDK 学习之Android.mk

    Android.mk file syntax specification Introduction: This document describes the syntax of Android.mk  ...

  4. Android NDK开发之Android.mk文件

    Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南   Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...

  5. Android之makefile

    在Android的源代码中,随处可见Makefile,那么Makefile到底是用来干嘛的呢?其实Makefile和Maven.ANT.Gradle一样,属于构建工具,当项目比较庞大的时候,就可以使用 ...

  6. Linux下命令行安装配置android sdk

    首先, 你得有个VPN 参考以下三篇完成Android SDK的安装 https://www.digitalocean.com/community/tutorials/how-to-build-and ...

  7. android开发学习---linux下开发环境的搭建&& android基础知识介绍

    一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...

  8. 编译 Linux 3.5 内核烧写 Android 4.2.2 到 Tiny4412 开发板

    . . . . . 昨天已经编译了 Android 4.2.2 的源码,详见<Ubuntu 14.04 编译 Android 4.2.2 for Tiny4412>一文. 今天我们继续剩下 ...

  9. 在Linux下adb连接不上android手机的终极解决方案

    转自: http://blog.csdn.net/liuqz2009/article/details/7942569 1.做android开发的过程,碰到了Linux下adb识别不了android设备 ...

随机推荐

  1. IOS渠道追踪方式

    本文来自网易云社区 作者:马军 IOS,安卓渠道追踪的差异 Google Play国内不可用,国内的安卓 App 分发,都是依托几十个不同的应用市场或发行渠道,如百度.360.腾讯等互联网企业以及小米 ...

  2. php实现socket简单的例子

    一.Socket简介 1.socket只不过是一种数据结构 2.使用这个socket数据结构去开始一个客户端和服务器之间的会话 3.服务器是一直在监听准备产生一个新的会话.当一个客户端连接服务端,它就 ...

  3. [RHEL] 配置 LVM 卷

    [RHEL] 配置 LVM 卷 一.Introduction 基础预览 :LVM 认知与扩容操作 高端实战:Linux系统如何迁移至LVM磁盘 之前转过一篇文章 LVM分区在线扩容 ,其原因是我需要给 ...

  4. 「雅礼集训 2018 Day10」贪玩蓝月

    题目链接 题意分析 我们考虑维护两个栈 分别支持左边的插入删除以及右边的插入删除 然后对于两两个栈的我们需要用背包求出最优答案 注意 删除时如果不够的话 我们需要从另一个栈中取出一半加入另一个栈中 注 ...

  5. 【转载】Analysis Service Tabular Model #002 Analysis services 的结构:一种产品 两个模型

    Analysis Service 2012 Architecture – One Product, Two Models 在之前SQL Server 2008 R2 版本中的分析服务实际上只有一个版本 ...

  6. shell-005:备份。

    #  这个案例感觉有点绕,如果是本地机器备份完全没必要.下面带颜色的写法值得我们借鉴,所以还是做下笔记吧 #!/bin/bash # 找出//目录下所有txt结尾的文件,且形成一个列表清单的文件 fi ...

  7. javaweb Servlet接收Android请求,并返回json数据

    1.实现功能 (1)接收http请求 (2)获取Android客户端发送的参数对应的内容 (3)hibernate查询数据库 (4)返回json数据 2.java代码 import EntityCla ...

  8. [性能测试]:内存泄漏以及MAT(Memory Analyzer Tool)工具使用分析

    一.今天在查看服务器时候,发现内存使用率直接就到99%了, 二.用ps -uaxw查看一下,每个占用内存较多的进程情况: 三,挑出可疑的进程,生成dump文件: jmap -dump:format=b ...

  9. [转] Mock以及Mockito的使用

    http://www.open-open.com/lib/view/open1462177583813.html [From] http://www.open-open.com/lib/view/op ...

  10. centos 7 上安装 testlink 1.9.15/1.9.16/1.9.17/1.9.18 (mysql/php/httpd)

    1.9.18 的System Requirements - server.注意,适用于 1.9.15 及以后. Server environment should consist of: web-se ...