Linux之Makefile
来源:互联网 发布:115个java面试题和答案 编辑:程序博客网 时间:2024/04/29 10:10
》 学会编写Makefile文件是完成大型项目的基础,一个大型工程里的源文件不计其数,按类型,功能,模块分别放在若干个目录中,makefile定义了一系列规则指定那些文件需要先编译,哪些需要后编译等等.....甚至于更复杂的功能操作。makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是--------“自动化编译”,一旦写好这个文件,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。
》 make是一个命令工具,是一个解释makefile文件中指令的命令工具。它可以在必要时重新编译所有受影响的源文件。
》 makefile文件的语法
$ makefile文件由一组依赖关系和规则构成。每个依赖关系由一个目标(即将要创建的文件)和一组该目标所依赖的源文件组成。而规则描述了如何通过这些依赖文件创建目标。一般来说,目标是一个单独的可执行文件。
$ make命令会读取makefile文件的内容,它先确定要创建的目标文件,然后比较该目标所依赖的源文件到日期和时间,以决定该采用哪条规则来构造目标。通常在创建最终的目标文件之前,需要先创建一些中间目标。make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。
》make命令的选项和参数
make命令本身有许多选项,其中最常用的三个选项是:
- -k:它的作用是让make命令在发现错误时仍然继续执行,而不是在检测到第一个错误时就停下来。我们利用这个选项在一次操作中发现为编译成功的源文件。
- -n:它的作用是让make命令输出将要执行的操作步骤,而不真正执行这些操作。
- -f filename:它的作用是告诉make命令将哪个文件作为makefile文件。如果未使用这个选项,make命令将首先查找当前目录下名为makefile的文件,如果该文件不存在,就会查找名为Makefile的文件。
为了指示make命令创建一个特定的目标(通常是一个可执行文件),我们可以把该目标的名字作为make命令的一个参数。否则,make命令将试图创建列在makefile文件中的第一个目标。许多程序员都会在自己的makefile文件中将第一个目标定义为all,然后再列出其他的从属目标。这样就可以明确地告诉make命令,再未指定特定目标时,默认情况下应该创建哪个目标。
》依赖关系:例如有一个main.c main.h文件,则main.o依赖于main.c和main.h,如果这两个文件任一有变化,就需要重新编译来生成main.o文件。
makefile文件的编写规则是:先写目标文件后接一个冒号然后用一个空格或者tab隔开最后是用空格或者tab隔开的文件列表(依赖的文件,用于创建目标文件)
<span style="font-size:18px;"> mymain:main.o main.o:main.c main.h</span>如上,mymain文件生成依赖main.o, main.o文件生成依赖main.c和main.h。
如果我们想一次性生成多个文件,就可以利用名义上的目标all
<span style="font-size:18px;">all:myapp myapp.1</span>如果make未找到制定目标all则只创建makefile文件里的第一个目标。
》规则:makefile文件里的第二类内容就是规则,规则定义了目标的创建方式,如下图:
<span style="font-size:18px;">mymain:main.o gcc -o mymain main.omain.o:main.c main.h gcc -c main.c </span>也许有些同学理解不了gcc后面的参数,那么这里说一下文件的生成方式:例如有一个test.c文件,那么它运行的过程是什么呢?
预处理:test.c ----test.i gcc --E (大写)
编译: test.i ----test.s gcc -S(大写)
汇编: test.s ----test.o gcc -c
链接: test.o ---- test gcc -o
上面就是文件的依赖关系,实质就相当于文件的逆生长。然后 make -f makefile 就可以生成我们想要的目标文件mymain。make命令处理makefile文件中的依赖关系,确定需要创建的文件以及创建顺序。虽然我们把目标mymain列在最前面,但make命令能够自行判断出创建文件的正确顺序。它调用在规则部分给出的命令以创建相应的文件,同时会在执行时在屏幕上将命令显示出来。
<span style="font-size:18px;">mymain:main.c gcc -o mymain main.c:PHONY:clean</span>
<span style="font-size:18px;"> clean: rm -f mymain</span>上面这种写法mymain直接依赖main.c,生成一个伪目标,移除目标文件。
命令模式下make 一下生成目标文件mymain,make clean 移除目标文件
0 0
- 《linux 内核Makefile》之$(CURDIR)/Makefile Makefile: ;
- linux基础之Makefile
- Linux之Makefile (一)
- Linux之Makefile (二)
- Linux之Makefile (三)
- Linux笔记之Makefile
- Linux之Makefile(.PHONY)
- Linux实验之Makefile
- linux之makefile学习
- linux之Makefile(上)
- linux之Makefile(下)
- Linux之Makefile
- Linux之Makefile 通用版
- Linux之Makefile
- Linux之MakeFile小记
- Linux-Makefile(GNU Makefile之"ifeq()"作用)
- Linux之Makefile(Makefile规则例子)
- Linux之Makefile(Makefile规则)
- 第5.7节 把某年中第几天的表示形式转换为某月某日的日期表示形式
- double计算,小数计算,BigDecimal计算,货币计算,float计算,浮点计算
- openlayers 2实现vector图层文字标注
- 基于报错注入的Python代码
- 摆方格
- Linux之Makefile
- 安装Ubuntu 16.04后要做的事
- MySql 修改字段名称和数据类型
- 软件工程-构建之法 学习方法
- 整数拆分 整合算法
- 101. Symmetric Tree 对称树 (难点!)
- Ad-hoc类型同步识别
- Android EditView 输入限制(软键盘限制)
- 大型网站的架构和演变-引子