MakeFile入门笔记
本文最后更新于:2022年10月18日 上午
MakeFile入门笔记
平时开发和配置环境时有时会需要编译c,就经常遇见这个东西,刚好上课也学这个东西,就稍微学一些MakeFile。因为也是入门,所以可能比较乱。
快速的理解MakeFile+读懂一个MakeFile - 知乎 (zhihu.com)
Makefile入门(超详细一文读懂)_晨曦艾米的博客-CSDN博客_makefile
MakeFile是什么
MakeFile是用来编译C/C的工具,他能通过自身的语法连接C/C开发过程中写的各类.cpp
、.h
、.o
文件,最终生成可执行文件。直观来说,是“编译、链接、删除、移动”的整个过程。
MakeFile语法
MakeFile的基本模式如下:
1 |
|
在编译程序时,需要定义目标target以及其依赖文件prerequisite,然后执行的各种命令,表示我们将通过命令利用依赖文件来达成目标。默认MakeFile的第一个target是最终的target,并且命令的缩进是一个Tab
而不是4个空格。特殊地,可以指定目标为ALL
来指定需要生成的多个目标文件。
MakeFile中的变量和Shell相似,使用$
表示取变量,当变量名多余1个字符时要加上()
,除此以外也有一些特殊的变量:
1 |
|
MakeFile的变量赋值会有一些奇怪,使用等号=
和冒号等号:=
是不一样的,此外?=
表示如果变量未赋值那么赋予一个值,有一种a = 1 if a is None else a
这种感觉。
1 |
|
MakeFile有一些预定义变量,比如CC是指定c编译器的名称,默认是cc
1 |
|
MakeFile函数比较特殊:
1 |
|
还有一个比较费解的伪目标.PHONY
,这个会定义一些target,这些target不会与目录下的文件产生关系,所以每次都需要进行构建。比如下面这个例子,将所有.c
文件编译成.o
文件,然后又把.o
编译成.out
文件,假如make clean
,那就会删除这个.out
。
1 |
|
一般还经常会指定头文件路径,也就是编译时在gcc中通过-I
参数指定某个include
目录,在MakeFile中,经常这么写:
1 |
|
那库文件(lib)也是类似的写法,不过是-L
参数。
实际使用的时候经常是make clean
、make
、make install
,那加上参数其实就是特别编译MakeFile中指定的target,如下,install
目标就是把编译出来的可执行文件复制到固定的目录。
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!