Makefile文件编写

Posted 技术热爱者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile文件编写相关的知识,希望对你有一定的参考价值。

1. 概述

Makefile,很多windows程序可能都没听说过
简单的说,Makefile是Unix/Linux环境下描述了整个工程的编译、连接等规则的文件,其主要包括三点:

  1. 工程中的哪些源文件需要编译以及如何编译
  2. 依赖库以及库所在的位置
  3. 想得到什么:可执行文件?静态库?动态库?
    项目中,我们会有很多源文件、头文件、依赖库文件、配置文件等等,通过Makefile定义规则来制定编译顺序,编译规则,编译依赖,甚至更复杂的功能,将极大的方便我们的开发,其最大的好处就是”自动化编译“,通过‘make’就可以方便的进行整个项目的编译工作。

2. 编译链接

从源码到可执行文件,具体步骤:
源码—>预处理—>编译—>汇编—>链接
我们常常把预处理、编译和汇编三个阶段统称为编译阶段,在这个阶段,编译器会检查程序语法、函数与变量是否声明等。
经过编译之后,unix/linux下,将得到.o文件(一般来说,每个源文件都能生成一个对应的.o文件),即object file(windows下即.obj文件),.o不能直接运行,我们需要将其合成可执行文件,这个过程就叫链接。在链接过程,链接器会在所有的.o文件中找寻函数的实现,如果找不到,则会报链接错误。

3.Makefile规则

Makefile只有一个规则:
target: prerequisites
command

target:即目标,它可以是可执行文件、可以是.o文件,也可以是一个标签,简单的说,它就是你要做的事情。
prerequisites:生成target所需要的条件,它可以是一个文件,也可以是另外一个target
command:具体执行的命令

解释如下:target这个目标依赖于prerequisites中的文件,其生成规则定义在command中。
更简单一点表达:如果prerequisites中任何一个文件的时间要比target文件更新的话,command所定义的命令就会执行。

eg:
第一个规则

test: main.o hello.o
gcc main.o hello.o –o test

第二个规则

main.o: main.c
gcc –c main.c

第三个规则

hello.o: hello.c hello.h
gcc –c hello.c

第四个规则

clean :
rm –rf *.o
rm –rf test

第一个规则:
test就是target, main.o和hello.o是prerequisites,'gcc main.o hello.o –o test’是command。
即:要生成test,就需要有main.o和hello.o,如果main.o或者hello.o文件的时间比test新(或者test文件不存在),则会执行命令’gcc main.o hello.o –o test’,

第二个规则:
target是main.o,main.c是prerequisites,’gcc –c main.c’是command
即:要生成test,就需要main.c,如果main.c文件的时间比main.o新,则会执行’gcc –c main.c’

第三个规则和第二个规则类似

第四个规则:
这里,target是clean,此处,clean并不是一个文件,而是一个动作的名字,它的执行,需要显示的在make命令后制定,例如,此处执行‘make clean’,将调用其后的command,即‘rm –rf *.o rm –rf test’,另外,此处没有prerequisites,即任何时候都执行command

以上是关于Makefile文件编写的主要内容,如果未能解决你的问题,请参考以下文章

如何编写makefile

如何制作一个makefile文件

Makefile编写

Makefile文件编写小记

GCC学习 如何编写makefile

项目通用Makefile的编写(包含Makefile.build文件分析)