GNU-makefle (一) 基本介绍

参考链接:http://blog.csdn.net/haoel/article/details/2886

android ndk编译,和源码环境下的编译需要写一个mk文件,其实它就是makefile文件。

在linux(unix) 平台上,makefile(或Makefile)它就是一个构建的规则,描述了哪些文件需要先编译,哪些后编译,如何链接... make就是一个命令工具,它来解释makefile中的规则,执行并生成规则中的定义。

全篇以c / c++ 代码为例。

关于程序的编译和链接:

编译生成目标文件(即中间代码文件object file),然后链接这些目标文件到我们的应用程序,生成可执行文件

目标文件,win平台:.obj       unix平台:.o

一组目标文件可以打包生成一个 库文件,库文件分静态链接库和动态链接库。

静态库,表示在程序编译时用到的库。win:.lib    unix:.a

动态库,表示在程序运行时用到的库。win:.dll    unix:.so

动态库,在程序运行时才载入,如果程序中或者系统中,没有,那么就加载;已有,则直接使用。

它的好处是,方便共享。本着有需求才调入原则,大大节省了系统资源。

makefile文件的命名:maikefile 或 Makefile

一个例子,所有.c和.h 都在同一级目录中:

edit : main.o kbd.o command.o display.o 	insert.o search.o files.o utils.o
		cc -o edit main.o kbd.o command.o display.o 		insert.o search.o files.o utils.o
 main.o : main.c defs.h
			cc -c main.c
 kbd.o : kbd.c defs.h command.h
			cc -c kbd.c
 command.o : command.c defs.h command.h
			cc -c command.c
 display.o : display.c defs.h buffer.h
			cc -c display.c
 insert.o : insert.c defs.h buffer.h
			cc -c insert.c
 search.o : search.c defs.h buffer.h
		cc -c search.c
 utils.o : utils.c defs.h
		cc -c utils.c
 files.o : files.c defs.h buffer.h command.h
		cc -c files.c

 clean :
		rm edit main.o kbd.o command.o display.o 			insert.o search.o files.o utils.o

冒号 左边的是 目标定义, 右边是它所依赖的。  目标 : 依赖

反斜杠\为一段命令的换行符。

表示执行命令时,左边的缩进要用使用TAB键。  例子中的cc命令 左边全是tab缩进。其他情况的间隔 都是用 空格。

上例子从上到下表示:

文件edit 依赖 一些.o 目标文件

创建edit执行文件,  cc -o 连续链接一些 .o文件

(执行make命令后,找到makefile或Makefile文件,读取它的规则

当读取到第一个目标文件(在本例中即是 edit)时,会将其作为最终需要生成的执行文件对待。

若某个.o不存在,或者修改了这个.o目标文件所依赖的文件,那么就需要新生成或重生成该.o,make会自动判断的。

以全局来说:就是被依赖者发生变化(比如头文件、源文件),那么依赖它的也将变化,相应的每一层级的依赖者都将变化。

)

main.o 依赖 main.c 和 defs.h      即 main.c 中 include “defs.h”

编译生成.o目标文件的执行命令 cc -c main.c

最后clean,在首个目标edit中没有被直接或间接依赖,那么它将不会被自动执行。而可以使用 make clean 来执行它所定义的命令

最后shell 进入工程所在目录,执行make命令

生成一个可执行文件:edit

时间: 2024-10-07 20:54:57

GNU-makefle (一) 基本介绍的相关文章

GNU编译工具链介绍---Antoconf

大家在下载很多自由软件的源码下来编译的时候,都要用到configure这个命令,然后make,make install等等,这里我们就浅显地介绍一下什么是autoconf: 1. 基本介绍 autoconf就是一个生成shell脚本(或者其他操作系统上的可解释脚本或程序)的程序,生成的shell脚本用来根据所在的编译环境对源码进行配置.举个很简单的例子,比如我在Linux和Mac上面编译同样一份源码,编译出的程序可能一个显示Linux版本信息,一个显示Mac的版本信息,这就是autoconf起到

GNU ARM 汇编指令

http://blog.chinaunix.net/u2/87718/showart_1683402.html GNU ARM 汇编指令简介第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C代码执行.需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范. 一. Linux汇编行结构任何汇编行

GNU ARM汇编快速入门

以前用ARM的IDE工具,使用的是ARM标准的汇编语言.现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处.其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看GNU ARM的汇编程序,用不了多少时间你就就可以无师自通了. ARM汇编语言源程序语句 ,一般由指令.伪操作.宏指令和伪指令作成.ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令. 目前常用的ARM编译环境有2种: ARMASM: ARM公司的IDE中使用了CodeWarrior的编译器,

Linux异步IO【转】

转自:http://blog.chinaunix.net/uid-24567872-id-87676.html Linux® 中最常用的输入/输出(I/O)模型是同步 I/O.在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止.这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU).但是在某些情况中,I/O 请求可能需要与其他进程产生交叠.可移植操作系统接口(POSIX)异步 I/O(AIO)应用程序接口(API)就提供了这种功能.在

ARM 汇编指令集

转载,方便查找用. ARM汇编指令集 一. 跳转指令    跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC写入跳转地址值. 通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用 MOV LR,PC 等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用. ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以

makefile中一些符号的含义

关于gnu make的详细介绍参看http://www.gnu.org/software/make/manual/make.html 规则 让我们先来粗略地看一看Makefile的规则. target ... : prerequisites ... command ... ... 目标:依赖 执行指令 ... target也就是一个目标文件,可以是Object File,也可以是执行文件.还可以是一个标签(Label). ① prerequisites就是,要生成那个target所需要的文件或是

理解Android系统(一)

理解Android系统 Android 是业界流行的开源移动平台,受到广泛关注并为多个手机制造商作为手机的操作系统平台.由于它的开放性,市面上又出现了它的很多改良定制版本.且广泛的应用在手机.汽车.电脑等领域.因此,研究其安全架构及权限控制机制具有非常的重要性. 本章从 Android 层次化安全架构入手,详细地介绍 Android 平台的安全架构及其权限控制机制,涵盖 Android 应用程序权限申请方法等,并从源代码实现层面来解析该机制. 1.1 系统的层级架构 Android架构,其实就是

老牌绘图工具pic的基本使用

作者小白对WYTIWYG(What You Think Is What You Get)"所思即所得"的绘图方式情有独钟.之前就听说过metapost及asymptote两种绘图工具,很多网友都说,两种绘图工具,会其一,就可满足一生所需. 作者也是无意当中发现了Raymond大叔(没错,就是那个<大教堂和集市>的作者)写的一篇文章<Making Pictures With GNU PIC>,介绍PIC的基本使用.其中,文章中说, "The pic la

Linux中ansible批量管理软件部署及剧本编写

服务器版本信息: Centos6.9 [[email protected] ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux ansible软件介绍 ansible是一个基于Python开发的自动化运维工具! 其功能实现基于SSH远程连接服务! ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等

supervisor安装篇

服务器环境: [[email protected] supervisor-3.1.3]# uname -a Linux kafka60 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 1,介绍 Supervisor是一个进程管理工具 用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需