Android系统开发(3)——Makefile的编写

Makefile是什么?

makefile的作用:

1、工程文件组织,编译成复杂的程序

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 [email protected]
.PHONY:clean
clean:
        rm hello2
install:
        cp hello2 /usr/local

运行make

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来看一下效果

执行make clean后func1.o func2.o main.o全部删除了(可以想到卸载程序的原理),下面我们就来添加一个install和uninstall伪目标

在我们执行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文件

这样做的好处就是在我们换编译器的时候非常方便。

下面我们来看看makefile中的自动变量及环境变量:

$*_______不包含扩展名的目标文件名称

$<_______第一个依赖文件名称

$?_______所有时间戳比目标文件晚的依赖文件

[email protected]______目标文件完整名称

$^_______所有不重复的依赖文件

这个时候我们应该清楚了刚开始写的那个Makefile文件的内容了

上面还对伪目标进行了声明(.PHONY)这样做的目的是为了避免和其他文件同名冲突。

时间: 2025-01-11 04:51:00

Android系统开发(3)——Makefile的编写的相关文章

Android系统开发(1)——GCC编译器的编译和安装过程

GCC编译器介绍 GCC编译器(GNG C Compiler)是GNU项目中符合ANSI C标准的编译系统,能够编译C  C++  Object C等语言编写的程序,同时GCC也是一个交叉编译器,特别使用于不同平台的嵌入式开发. GNU: GNU是"GNU is Not Unix"的递归缩写,1984年,史托曼开始GNU项目,这个项目的目的是创建一个自由,开放的Unix操作系统(Free UNIX),刚开始史托曼参考UNIX上面的软件,开发出功能类似的软件,在开发期间并没有看其他软件的

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

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

Android菜鸟如何学习Android系统开发?

如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程,只是很多同学在大学期间并没有好好学习,如果对它掌握的不太好或者很久没用了,建议先从将其好好复习一下,将其基本的语法再好好回顾一下,最好能搭建一个环境来运行.调试它.如果没有学过,不妨也提前学习一下,可以参考清华大学出版社出版的谭浩强老师的<C语言程序设计>,推荐这本书的

Android系统开发(2)——GDB调试工具

调试的过程 我们在eclipse中来看一下一般调试的过程: 1.debug模式编译 2.打上断点 3.运行调试 4.单步调试 step into:跳到函数体内部 step over:不跳到函数体内 step return:运行完当前函数 5.继续运行 continue 6.打印和监控值 GDB调试 先写一段C++的代码,代码内容如下: 使用debug模式编译: 进入Debug调试模式: 1.打断点,打断点的方式如下(GDB中的命令可以使用首字母来替代,比如break和b的作用相同) break 

(2) 搭建 Android 系统开发环境

说干就干,先按 Google 官方的指导,搭建 Android 系统开发环境.页面(需FQ):http://source.android.com/source/initializing.html 安装 ubuntu-14.04 64bit 安装系统有两种方式可选,直接装在物理机上或装在虚拟机中,区别主要就是性能了,本次是安装在虚拟机中的.之前都是装在物理机上的,但是只有一台电脑,而做开发的时候往往还要做些笔记或者其它的事情.总之,在 ubuntu 中完成这些工作并不容易,以前折腾过,也怕了.另外

《Android系统开发》笔记

<Android系统开发>笔记1:Android系统概述 Android四层架构: 1. Linux Kernel&driver层 a.依赖于Linux 2.6内核,包含安全性.内存管理.进程管理,网络协议栈.驱动模型等b.Android自己加入的驱动,Binder IPC驱动,显示驱动,输入设备驱动.音频系统驱动,摄像头驱动,Wifi驱动.蓝牙驱动,电源管理等 2. Android本地库 & Java执行环境层 Android本地库(C/C++)Bionic:为嵌入式设备定制

Android系统开发的学习教程在哪里可以看?

Android蛰伏很多年,终于赶上移动互联时代,迅猛崛起,以80%以上的占比成为行业占有率首位,Android程序员也成为移动互联发展必不可少的推动者,移动互联网行业的发展人才是非常重要的,很多开发者都纷纷转型到Android,这些传统的开发者想要从事移动互联网行业的开发,需要参加培训,参加Android培训来提升自身的技术实力,传智播客Android培训行业的领导者,为各大企业很多企业输送了大量的Android人才,来提升人才的战略. 目前Android系统占据了移动互联网行业的主体,很多用户

Android系统开发实务实训

实训项目 :               Android系统开发实务实训                                            项目源码获取:   <绝地坦克>是一款坦克大战类型的javascript网络游戏,本游戏项目运行说明可分为三个方向:说明运行的项目是什么.如何运行,以及运行该项目的结果和意义是什么?其中运行的是什么包括:项目说明与功能分析:如何运行主要是指,该项目程序的实现原理和运行方式.具体说明如下: 一.项目说明与功能分析 首先从逻辑上而言,本项目

【Android 系统开发】 编译 Android 系统 u-boot 内核 源码 并烧写到 OK-6410A 开发板上

博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 Android 光盘 下载地址 : http://pan.baidu.com/share/link?shareid=3662728609&uk=2754759285 ; -- 光盘所含内容 : Android 引导 u-boot 源码, Android 内核 源码, Android 系统源码, 交叉编