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

  1. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  2. 《Android系统开发》笔记

    <Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内 ...

  3. Android系统开发--灯光系统之电池灯的流程分析

    Android系统开发--Android灯光系统之电池灯的流程分析 前期系统准备 运行初始化,创建系统服务 创建电池服务,获得电池灯;创建监听者监听上报电池事件: mSystemServiceMana ...

  4. Android系统开发实务实训

    实训项目 :               Android系统开发实务实训                           项目成品名称:         绝地坦克                 ...

  5. Android系统开发 编译系统签名的APP

    前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...

  6. Android 系统开发做什么?

    题外话 18 年我从 Android 应用开发转 Framework 层开发了,从此开启了 996 幸福生活,博客技术文更新基本停滞了,被工作占据了过多的精力,实在没时间像以前一样拟稿.写作,实践.反 ...

  7. 浅谈Android系统开发中LOG的使用

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...

  8. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

  9. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

随机推荐

  1. 04-hibernate注解-一对一双向外键关联

    一对一双向外键 1,主控方的配置同一对一单向外键关联. 2,@OneToOne(mappedBy="card") //被控方 @OneToOne(mappedBy="ca ...

  2. Random.org -- 真正的随机数生成器

    接触过程序设计的人一定对随机数不陌生.随机数的用途非常广,比方在測试.分布和统计程序.游戏中. 大多数编程语言也提供了随机数库.能够方便的使用. 只是从严格意义上来讲,这些程序生成的随机数并非真正的随 ...

  3. iTunes 无法添加 iPhone 自定义铃声

    本篇文章由:http://xinpure.com/itunes-unable-to-add-iphone-custom-ringtones/ 新版本 iTunes 需要在 菜单栏 -> 文件 中 ...

  4. css定位positon

    值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...

  5. jmeter ---测试TCP服务器/模拟发送TCP请求

    jmeter测试TCP服务器/模拟发送TCP请求 jmeter测试TCP服务器,使用TCP采样器模拟发送TCP请求. TCP采样器:打开一个到指定服务器的TCP / IP连接,然后发送指定文本并等待响 ...

  6. Mongodb - TTL(time to live)特性

    TTL集合支持mongodb对存储的数据进行失效时间设置,经过指定的时间段后.或在指定的时间点过期,集合自动被mongod清除.这一特性有利于对一些只需要保存一定时间的数据信息进行存储,比如机器产生的 ...

  7. 阿里云slb实现多域名https

    刚开始接锅,没注意原来站点的https配置在slb上,在服务器上配置一顿操作猛如虎,细细检查一遍,感觉良好,一测试发现不对劲,检查发现原来https配置在阿里云slb上,阿里云还是做得不错的 ,但是现 ...

  8. django 查询集 API

    filter 表示=, 返回一个新的QuerySet,包含与给定的查询参数匹配的对象.exclude 表示!=. 返回一个新的QuerySet,它包含不满足给定的查找参数的对象. annotate 使 ...

  9. IIS6.0应用程序池回收(转载)

    这段时间公司的程序经常出现问题,然后整个应用程序就不能访问了,我们的服务器版本:window 2003 SP1,IIS6.0,没有安装Microsoft Visual Studio .NET . 问题 ...

  10. void *指针的加减运算

    1.手工写了一个程序验证void *指针加减运算移动几个字节: //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, cha ...