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运行环境层; -- 应用框架层; -- 应 ...
随机推荐
- Vim快捷键整理
Vim主要分为两种模式一种是Insert模式,该模式下可以像其它文本编辑器一样正常输入字符:另一种是Normal模式,该模式下Vim监听用户的按键可以对文本进行快速修改. 想要从Insert模式切换到 ...
- Openerp开发进销存系统总结
转自 :http://blog.sina.com.cn/s/blog_7cb52fa80101ngt8.html 差不多用了2个星期的闲余事件,对于openerp v7.0进行了学习和应用开发.细节总 ...
- Docker Container同时启动多服务 supervisor
Docker Container同时启动多服务 转载请注明来自:http://blog.csdn.net/wsscy2004 昨天踩了个天坑,我有一个基本的镜像centos6.5+ssh,是通过Doc ...
- ElasticSearch「1」本地安裝Elasticsearch 6.0.1 + Elasticsearch-head插件
# 下載包 https://www.elastic.co/downloads/past-releases/elasticsearch-6-0-1 https://github.com/mobz/ela ...
- [机器学习实战] 决策树ID3算法
1. 决策树特点: 1)优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据. 2)缺点:可能会产生过度匹配问题. 3)适用数据类型:数值型和标称型. 2. 一般流程: ...
- 实时Web的发展历史
传统的Web是基于HTTP的请求/响应模型的:客户端请求一个新页面,服务器将内容发送到客户端,客户端再请求另外一个页面时又要重新发送请求.后来有人提出了AJAX,AJAX使得页面的体验更加“动态”,可 ...
- atitit.atiHtmlUi web组件化方案与规范v1
atitit.atiHtmlUi web组件化方案与规范v1 1. 如何在现有html 标签基础上定义自己的组件1 2. 组件的构成与定义1 3. 组件的加载1 4. 组件css的加载2 5. 操作组 ...
- migrate的使用
安装完yii2后,需要创建一张user表,这里用migrate创建 1.在dos窗口下,先cd到项目的目录,比如E:\>cd E:\Visual-AMP-x64\www\blog\blog 2. ...
- druid问题记录
1 {"error":"Instantiation of [simple type, class io.druid.indexing.kafka.supervisor.K ...
- Window 窗口类
窗口类 WNDCLASS 总结 总结为下面的几个问题: . 什么是窗口类 . 窗口类的三种类型 . 窗口类各字段含义 . 窗口类的注册和注销 . 如何使用窗口类,子类化.超类化是什么 下面分别描述: ...