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. maven自动打包到tomcat 8

    <build> <finalName>maven-project</finalName> <plugins> <plugin> <gr ...

  2. 【HTML】百度地图webAPI使用

    1.登录百度地图,创建WEB应用,设置白名单.获取该WEB应用的ak 2.在页面引入相应的js和ak 3.效果(CSS不提供): 4.实例化地图map,并给map添加相应的搜索和确定坐标事件 < ...

  3. Python 的__name__属性

    Python 的__name__属性: 一个模块被另一个程序第一次引入时,其主程序将运行. 如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身 ...

  4. 修改select下拉框的下拉按钮

    ie上的下拉框下拉按钮真是太丑了,如何把他自定义一下呢? 首先,把浏览器自带的下拉框去掉:  select::-ms-expand { display: none; } 接下来,用自己喜欢的下拉图片去 ...

  5. VSCode集成Git代码管理

    一.安装和配置VSCode与Git 1.下载Git并安装: https://git-scm.com/download/ 2.下载VSCode并进行安装: https://code.visualstud ...

  6. AAAA block

    [self AAAA:^(BOOL isSuccessed, id userInfo, NSString *errorMsg) { NSLog(@"AAAA: %d, userInfo: % ...

  7. 【Java集合源代码剖析】TreeMap源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36421085 前言 本文不打算延续前几篇的风格(对全部的源代码加入凝视),由于要理解透Tr ...

  8. c#中abstract、override、new、virtual、sealed使用

    abstract     修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现 ...

  9. Exif.js获取图片的详细信息(苹果手机移动端上传图片旋转90度)

    Exif.js插件介绍 http://code.ciaoca.com/javascript/exif-js/ iOS手机竖着拍的照片经过前端处理之后被旋转了90°的原因以及解决方案 https://w ...

  10. python3 解析xml

    转载:http://www.jb51.net/article/79494.htm 这篇文章主要为大家详细介绍了深入解读Python解析XML的几种方式,以ElementTree模块为例,演示具体使用方 ...