Makefile 入门与基本语法 分类: C/C++ ubuntu 2015-05-18 11:16 466人阅读 评论(0) 收藏
2015-05-18 11:16
295 查看
在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每一个Linux程序员都必须拥有的基本素质。Makefile可以自动识别哪些源文件被更改过,需要重新编译,那些不需要。从而节省大型工程重新编译的时间。规则如下:
如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。
如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
学会编写Makefile,不仅仅有益于你在Linux下编写大型工程。同时也能帮助你理解编译原理。远离IDE,了解编译过程。
废话少说,Makefile其实最主要的语法只有一句:
target就是目标文件,prerequisites表示所有生成目标文件所需的拥有依赖关系的文件。command就是由依赖文件生成目标文件的编译命令。
所以,对于单个的.c文件,一个最最简单的Makefile如下:
当然,对于单个C文件使用Makefile几乎没有意义。
下面来看一个稍复杂一点儿的Makefile文件:
这是一个稍有实用价值的Makefile,工程由四个源文件构成:my.h 1.c 2.c main.c。
放在最前面的
是变量定义。Makefile中的的变量定义多为字符串,主要目的是为了避免重复长字符串输入。
1.o 2.o main.o 分别是三个源文件生成的链接文件。如果你不知道链接文件是什么。。。。找度娘吧。。
首先第一个target一般为最终目标文件,之后的target一般为过程文件。
.PHONY是用来定义伪目标用的。伪目标不是实际要生成的文件,一般为make命令带入的参数。例如上面文件中的clean,其对应的命令为清除所有中间文件以及最后的目标文件。
其实,一般不定义伪目标也是OK的,但是一旦目录下出现了和伪目标重名的文件。这时候Makefile执行伪目标命令就会出错。因为Makefile不知道这是伪目标,而伪目标又没有依赖文件,所以Makefile会跳过伪目标文件对应的命令。
以上,是对Makefile的一个简单入门介绍,一般,用以阅读大多数的Makefile都已经足够了。深究请百度或者Google。
如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。
如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
学会编写Makefile,不仅仅有益于你在Linux下编写大型工程。同时也能帮助你理解编译原理。远离IDE,了解编译过程。
废话少说,Makefile其实最主要的语法只有一句:
target ... : prerequisites ... command......
target就是目标文件,prerequisites表示所有生成目标文件所需的拥有依赖关系的文件。command就是由依赖文件生成目标文件的编译命令。
所以,对于单个的.c文件,一个最最简单的Makefile如下:
object: main.c gcc -o object main.c
当然,对于单个C文件使用Makefile几乎没有意义。
下面来看一个稍复杂一点儿的Makefile文件:
DIR=./ object: main.o 1.o 2.o gcc -o object main.o 1.o 2.o 1.o: 1.c my.h gcc -c 1.c 2.o: 2.c my.h gcc -c 2.c main.o: main.c my.h gcc -c main.c .PHONY: clean clean: rm $(DIR).o object
这是一个稍有实用价值的Makefile,工程由四个源文件构成:my.h 1.c 2.c main.c。
放在最前面的
DIR=./
是变量定义。Makefile中的的变量定义多为字符串,主要目的是为了避免重复长字符串输入。
1.o 2.o main.o 分别是三个源文件生成的链接文件。如果你不知道链接文件是什么。。。。找度娘吧。。
首先第一个target一般为最终目标文件,之后的target一般为过程文件。
.PHONY是用来定义伪目标用的。伪目标不是实际要生成的文件,一般为make命令带入的参数。例如上面文件中的clean,其对应的命令为清除所有中间文件以及最后的目标文件。
其实,一般不定义伪目标也是OK的,但是一旦目录下出现了和伪目标重名的文件。这时候Makefile执行伪目标命令就会出错。因为Makefile不知道这是伪目标,而伪目标又没有依赖文件,所以Makefile会跳过伪目标文件对应的命令。
以上,是对Makefile的一个简单入门介绍,一般,用以阅读大多数的Makefile都已经足够了。深究请百度或者Google。
相关文章推荐
- PHP从零单排(一)PHP基本语法 分类: PHP 2014-04-18 09:36 107人阅读 评论(0) 收藏
- JSON入门之二:org.json的基本用法 分类: C_OHTERS 2014-05-14 11:25 6001人阅读 评论(0) 收藏
- 博弈论入门小结 分类: ACM TYPE 2014-08-31 10:15 73人阅读 评论(0) 收藏
- 关于 frame的一些基本知识 分类: ffmpeg-SDL-VLC-Live555 2013-07-22 16:30 315人阅读 评论(0) 收藏
- python数据持久存储:pickle模块的基本使用 分类: python python基础学习 python 小练习 2013-06-17 14:41 209人阅读 评论(0) 收藏
- Com编程入门——什么是COM,如何使用COM 分类: com技术 2013-09-30 08:17 520人阅读 评论(0) 收藏
- Gora快速入门 分类: C_OHTERS 2015-01-30 09:55 465人阅读 评论(0) 收藏
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(1)――基本概念 分类: vxWorks 2014-03-12 09:41 489人阅读 评论(0) 收藏
- Makefile的规则 分类: arm-linux-Ubuntu 2013-09-11 14:09 517人阅读 评论(0) 收藏
- Json入门 分类: C_OHTERS 2014-04-23 16:20 601人阅读 评论(0) 收藏
- C语言基础:进制转换,变量,常量,表达式,基本数据类型,输出函数,输入函数,运算符. 分类: iOS学习 c语言基础 2015-06-10 21:39 25人阅读 评论(0) 收藏
- MySQL是什么玩意儿(二)MySQL中的SQL语法基础 分类: MySQL 2014-04-26 10:16 173人阅读 评论(0) 收藏
- Mahout快速入门教程 分类: B10_计算机基础 2015-03-07 16:20 508人阅读 评论(0) 收藏
- shell入门之流程控制语句 分类: 学习笔记 linux ubuntu 2015-07-10 16:38 89人阅读 评论(0) 收藏
- 使用URLConnection获取网页信息的基本流程 分类: H1_ANDROID 2013-10-12 23:51 3646人阅读 评论(0) 收藏
- DirectX:函数可以连接任意两个filter 分类: DirectX 2014-10-27 19:20 466人阅读 评论(0) 收藏
- 算法入门----第2章 分类: 算法导论 2011-03-03 11:11 131人阅读 评论(0) 收藏
- 《Go语言入门》第一个Go语言程序——HelloWorld 标签: go语言helloworld 2015-11-29 18:46 4066人阅读 评论(4) 收藏 举报 分类: go语言入门(3)
- Android APP开发入门教程-Button 分类: JAVA 2015-01-15 14:25 360人阅读 评论(0) 收藏
- MPEG2_TS流基本概念和数据结构 分类: ffmpeg-SDL-VLC-Live555 2015-04-02 15:44 401人阅读 评论(0) 收藏