Android系统开发(3)——Makefile的编写
Makefile是什么?
makefile的作用:
1、project文件组织,编译成复杂的程序
2、安装及卸载我们的程序
Makefile使用演示样例
在/home/username/makefile文件夹下有例如以下三个文件:
main.c
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[]){
int x, y;
sscanf(argv[1], "%u", &x);
sccanf(argv[2], "%u", &y);
printf("func1:%u\n", func1(x, y));
printf("func2:%u\n", func2(x, y)); return 0;
}
func1.c
#include <stdio.h>
int func1(int x, int y){
return x + y;
}
func2.c
#include <stdio.h>
int func2(int x, int y){
return x + y;
}
以下我们開始编译上面的文件:
写好的Makefile文件例如以下:
obj=main.c func1.c func2.c
hello2:$(obj)
gcc $^ -o $@
.PHONY:clean
clean:
rm hello2
install:
cp hello2 /usr/local
运行make
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
Makefile的编写规则
Makefile由若干条上面的规则构成。每一个规则例如以下:
taget目标:prequisites(依赖)
command(命令)
注意:第二行必须有一个Tab缩进
比如上面两行表示要生成目标文件hello,在生成hello的同一时候须要依赖main.o func1.o func2.o这三个文件。并且运行gcc main.o func1.o func2.o -o hello命令来生成。
#建立第一个Makefile文件
hello:main.c func1.c func2.c
gcc main.c func1.c func2.c -o hello
我们来改动一下上面的Makefile
#建立第二个Makefile文件
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o:func2.c
gcc -c func2.c
发现不仅生成了hello并且多了几个func1.c func1.o func2.c func2.o main.c main.o文件,以下我们改动一下Makefile文件。加入一个伪目标
hello:main.o func1.o func2.o
gcc main.o func1.o func2.o -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o:func2.c
gcc -c func2.c clean:
rm func1.o func2.o main.o
clean就是一个伪目标,不会生成新的文件,以下我们来运行一下make clean来看一下效果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
运行make clean后func1.o func2.o main.o全部删除了(能够想到卸载程序的原理)。以下我们就来加入一个install和uninstall伪目标
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
在我们运行make install的时候会将我们用到的运行文件和库文件复制到指定文件夹,在运行uninstall的时候会删除安装时的复制文件。
以下我们来使用变量MObj取代main.o func1.o func2.o
MObj = main.o func1.o func2.o
hello:$(MObj)
gcc $(MObj) -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o:func2.c
gcc -c func2.c clean:
rm $(MObj)
install:
cp hello /usr/local/hello
uninstall:
rm /usr/local/hello
假设这样写MObj := main.o func1.o func2.o 表示不递归变量。
也能够使用系统的提前定义变量,常见的提前定义变量例如以下:
AR_____库文件维护程序的名称,默认值为ar
AS_____汇编程序的名称,默认值为as
CC_____C编译器的名称。默认值为cc
CXX____C++编译器的名称,默认值为g++
ARFLAGS_____库文件维护程序选项,无默认值
ASFLAGS_____汇编程序选项,无默认值
CFLAGS______C编译器选项,无默认值
CXXFLAGS____C++编译器选项,无默认值
以下我们使用提前定义变量来改写一下我们上面的Makefile文件
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGF3YW5nYW5iYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
这样做的优点就是在我们换编译器的时候很方便。
以下我们来看看makefile中的自己主动变量及环境变量:
$*_______不包括扩展名的目标文件名
$<_______第一个依赖文件名
$?_______全部时间戳比目标文件晚的依赖文件
$@______目标文件完整名称
$^_______全部不反复的依赖文件
这个时候我们应该清楚了刚開始写的那个Makefile文件的内容了
上面还对伪目标进行了声明(.PHONY)这样做的目的是为了避免和其它文件同名冲突。
Android系统开发(3)——Makefile的编写的更多相关文章
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- 《Android系统开发》笔记
<Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...
- Android系统开发--灯光系统之电池灯的流程分析
Android系统开发--Android灯光系统之电池灯的流程分析 前期系统准备 运行初始化,创建系统服务 创建电池服务,获得电池灯;创建监听者监听上报电池事件: mSystemServiceMana ...
- Android系统开发实务实训
实训项目 : Android系统开发实务实训 项目成品名称: 绝地坦克 ...
- Android系统开发 编译系统签名的APP
前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...
- Android 系统开发做什么?
题外话 18 年我从 Android 应用开发转 Framework 层开发了,从此开启了 996 幸福生活,博客技术文更新基本停滞了,被工作占据了过多的精力,实在没时间像以前一样拟稿.写作,实践.反 ...
- 浅谈Android系统开发中LOG的使用
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...
- 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上
博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813 本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...
- 【Android 系统开发】Android框架 与 源码结构
一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...
随机推荐
- 04-hibernate注解-一对一双向外键关联
一对一双向外键 1,主控方的配置同一对一单向外键关联. 2,@OneToOne(mappedBy="card") //被控方 @OneToOne(mappedBy="ca ...
- Random.org -- 真正的随机数生成器
接触过程序设计的人一定对随机数不陌生.随机数的用途非常广,比方在測试.分布和统计程序.游戏中. 大多数编程语言也提供了随机数库.能够方便的使用. 只是从严格意义上来讲,这些程序生成的随机数并非真正的随 ...
- iTunes 无法添加 iPhone 自定义铃声
本篇文章由:http://xinpure.com/itunes-unable-to-add-iphone-custom-ringtones/ 新版本 iTunes 需要在 菜单栏 -> 文件 中 ...
- css定位positon
值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...
- jmeter ---测试TCP服务器/模拟发送TCP请求
jmeter测试TCP服务器/模拟发送TCP请求 jmeter测试TCP服务器,使用TCP采样器模拟发送TCP请求. TCP采样器:打开一个到指定服务器的TCP / IP连接,然后发送指定文本并等待响 ...
- Mongodb - TTL(time to live)特性
TTL集合支持mongodb对存储的数据进行失效时间设置,经过指定的时间段后.或在指定的时间点过期,集合自动被mongod清除.这一特性有利于对一些只需要保存一定时间的数据信息进行存储,比如机器产生的 ...
- 阿里云slb实现多域名https
刚开始接锅,没注意原来站点的https配置在slb上,在服务器上配置一顿操作猛如虎,细细检查一遍,感觉良好,一测试发现不对劲,检查发现原来https配置在阿里云slb上,阿里云还是做得不错的 ,但是现 ...
- django 查询集 API
filter 表示=, 返回一个新的QuerySet,包含与给定的查询参数匹配的对象.exclude 表示!=. 返回一个新的QuerySet,它包含不满足给定的查找参数的对象. annotate 使 ...
- IIS6.0应用程序池回收(转载)
这段时间公司的程序经常出现问题,然后整个应用程序就不能访问了,我们的服务器版本:window 2003 SP1,IIS6.0,没有安装Microsoft Visual Studio .NET . 问题 ...
- void *指针的加减运算
1.手工写了一个程序验证void *指针加减运算移动几个字节: //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, cha ...