为什么要使用makefile文件
在大型项目编译多个文件的时候,在命令行中多次输入命令显得不太方便,将命令写到文件里,可以简化这个过程。makefile文件通过规则来定义文件之间的依赖关系,实现自动化编译。
对于编译,为了提高编译效率,需要满足的要求如下:
+ 未被编译的工程,所有源文件需要进行编译和链接
+ 部分源文件被修改,则只编译修改过的文件,并重新链接
+ 头文件被修改,则引用过该头文件的源文件需要重新编译链接
makefile文件的基本形式
makefile文件中大致有如下几种类型的成分:
显式规则
变量定义
文件指示
注释
显式规则
makefile的显式规则写法如下:
目标文件: 依赖文件
命令
生成目标文件需要依赖文件的存在,如果依赖文件中有任意一个文件比目标文件更加地新,则命令就要被执行,以重新生成目标文件。而依赖文件又可以作为目标文件,由其他的依赖文件来生成。这里的命令就是那些用gcc、nasm、ld等编译链接工具执行的命令,这个命令一定要以tab键开头。
对于文件的使用,只要在含有makefile文件的目录下,使用make命令就可以执行文件内的命令。程序会迭代地分析目标文件和依赖文件之间的新旧程度来判断是否执行命令,如果依赖文件不存在,则会去寻找对应生成依赖文件的那条规则,如果有最终的依赖文件无法找到,则会报错,显示编译失败。
在makefile文件中还有另外一种格式的语法,如下:
标签:
命令
这里的标签只是给了下面的命令取了一个别名而已,不过这句命令不会被隐式地执行,显示调用的方法如下:
make 标签
当然,为了防止这个不生成目标文件的标签和工程中的文件重名而导致无法运行这条命令,可以显示指明这是一个伪目标。
变量的定义
一个依赖文件会在makefile文件的多个地方出现,在大的工程里面,添加了一个文件之后需要对多处进行修改,容易出错,如果把文件名定义成变量,那么只要修改变量的值,就可以不用在出现文件名的每个地方都进行修改了。变量的申明形式如下所示:
变量名 = 文件名
使用变量的方式是在每次使用文件名的时候,用$(变量名)来表示。
注释
采用#作为注释的启始符号,只能进行单行注释。
注意:如果要求不显示命令,则在命令前面加@
为了防止命令的执行错误导致make退出,需要在命令之前加上-,用来表示即使命令执行失败,也不影响其他命令的执行,不会使make命令退出。