Makfile文件的编写

时间:2022-07-24
本文章向大家介绍Makfile文件的编写,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Makfile文件的编写

  • 不定期更新

make和Makefile

  • 以下来自百度百科

make:

make是一条计算机指令,是在安装有GNU Make的计算机上的可执行指令。该指令是读入一个名为makefile 的文件,然后执行这个文件中指定的指令。有时make又指GNU MakeGNU Make 是一个用来控制可执行文件和其他一些从源文件来的非源代码文件版本的软件。

Makefile:

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。

Makefile编写

  • 以下是本人自己比较喜欢用的Makefile的使用方式的总结,一般为单个项目产生单个可执行文件,一般是控制台程序或者opencv相关

简单的多文件的C/C++控制台程序

文件目录是:

ProjectName          #项目目录
├── Makefile         #项目根目录Makefile配置文件
├── main.c       	#mian方法,include了stack.h
├── stack.h        	 #站结构定义
└── stack.c        	 #栈方法实现

Makefile文件内容总览

object = main.o stack.o

main : $(object)
    gcc -o main $(object)

main.o : main.c
stack.o : stack.h stack.c

.PHONY : clean
clean:
    rm $(object)
  • 注意: 如果是编译C++的项目就需要在main生成的命令里面把gcc编译程序换成g++

解释

上述是我的C/C++多文件编译一般使用的Makefile编写风格,因为没有特殊的中间文件操作,所以都是用的make的自动规则,下面解释上面Makefile内容,基本上可以分成4部分:

在此之前,先说明一下Makefile基本规则:

基本上按照以下模板:

target ... : dependes ...
    command
    ...
  • 目标(target):目标顶格写,后面是冒号(冒号后面是依赖)。目标文件, 可以是 Object File, 也可以是可执行文件。
  • 依赖(dependes): 依赖是用来产生目标(target)的目标文件。
  • 命令(command):命令前面一定是Tab,不能是定格,也不能说多个空格。命令就是要生成那个目标需要做的动作(任意的shell命令)。

接下来继续讲解

一、目标及所有依赖定义

这部分是为了定义包含的链接目标文件

这部分对应的内容是

object = main.o stack.o

此处使用目标名object包含了main.ostack.o中间文件,这两个文件需要在下一部分中声明其生成方式。

二、声明目目标执行文件的生成方式

这部分是为了生成最终的可执行文件

这部分对应的内容是

main : $(object)
    gcc -o main $(object)

此部分规定了最终的目标文件的生成规则

三、声明依赖的目标文件生成

这部分是声明所有依赖的文件的生成方式,使用了make的默认生成规则,语法是 目标文件: 依赖的头文件和源文件

这部分对应的内容是

main.o : main.c
stack.o : stack.h stack.c

对应生成的是object的所有依赖文件

四、指定clean规则

这一步其实可以省略,主要目的是制定一个清理生成的中间文件的选项

这部分对应的内容是

.PHONY : clean
clean:
    rm $(object)

.PHONY : clean是说明clean是一个伪目标文件,从而不会对clean使用目标文件的生成。

该部分的主要内容就是rm $(object)这条命令,它会删除object的所有依赖的目标文件,如果存在的话。

使用

  • 生成可执行文件
make
  • 清除中间文件
make clean