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. 基于Nginx实现一个自己的HTTP模块

    /usr/local/nginx/conf/nginx.conf文件例如以下: #worker工作进程的用户及用户组 user weijl; #Nginx worker进程个数 worker_proc ...

  2. 批量删除git分支

    本篇文章由:http://xinpure.com/bulk-delete-git-branching/ 批量删除git分支 使用 git 时候,经常会发现,不知不觉就创建了大量的分支.那么,麻烦事就来 ...

  3. 解决 adb devices :???????????? no permissions 方法

  4. oracle 复杂的查找用法

    [第一题]: 找到员工表中工资最高的前三名,要求按如下格式输出(第一步部分):以及oracle查询结果指定分页显示的方法(第二部分). ——涉及Top-N分析问题. 一般不在子查询中使用order b ...

  5. LAMP架构三

    PHP相关配置 1.查找php配置文件/usr/local/php/bin/php -i或者phpinfo() [root@bogon admin]# /usr/local/php/bin/php - ...

  6. sklearn 随机森林方法

    Notes The default values for the parameters controlling the size of the trees (e.g. max_depth, min_s ...

  7. 前端_basic

    web: 分三部分:1.HTML:2.CSS:3.JavaScript. 1.HTML:用来构建网页的结构和内容: 2.CSS:用来给网页化妆,美化网页: 3.JavaScript:用来让网页呈现动态 ...

  8. 两款 REST 测试工具

    用CURL命令行测试REST API 无疑是低效率的,这里把最近使用的两款 Chrome 插件总结下 POSTMAN 简单易用 REST Console 功能强大 使用的话用POSTMAN就够用了,但 ...

  9. Iptables规则执行顺序详解

      1.The first is the mangle table which is responsible for the alteration of quality of service bits ...

  10. node.js安装与入门使用

    一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 的包管理器 npm,是全球最大的开源库生态系统. 提供事件驱动和非阻塞I/O API,可优化应用程序的吞吐量和规 ...