共计 1742 个字符,预计需要花费 5 分钟才能阅读完成。
前言
本文通过几个简略的示例,能够疾速理解 Makefile 的根本应用办法,实用于编译咱们平时练习所编写的小量代码。
1. make 命令
Makefile 文件内容: all 为 <font color=’green’> 指标 </font>,这里没有 <font color=’green’> 依赖 </font> 的文件,这条 <font color=’green’> 命令 </font> 是打印 (echo) 出“Hello Makefile”这行文字
all:
echo "Hello Makefile"
运行 make 后,终端打印的内容
$ make
echo "Hello Makefile"
Hello Makefile
能够看到,Makefile 的命令也打印在了终端,要想不输入命令的内容,能够 在命令后面加上 @
make 能够指定要生成的指标,如果不指定,则默认第一个指标,咱们将 Makefile 文件内容批改一下
all:
@echo "Hello Makefile"
test:
@echo "Hello Test"
运行不同的命令,能够看到不同的打印信息
$ make
Hello Makefile
$ make all
Hello Makefile
$ make test
Hello Test
2. 生成文件
假如当初有两个文件 fun.c 和 main.c,须要利用 Makefile 生成一个可执行文件 app。
fun.c 的内容
#include <stdio.h>
void fun()
{printf("This is fun()!\n");
}
main.c 的内容
extern void fun();
int main()
{fun();
return 0;
}
Makefile 的内容
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
当执行 make 命令后,终端会打印下列内容,并生成对应的 app , main.o ,fun.o 文件
gcc -o main.o -c main.c
gcc -o fun.o -c fun.c
gcc -o app main.o fun.o
3. 革除文件
仍旧是下面的 Makefile 和源文件,咱们输出 make clean,就能够革除刚刚生成的 3 个文件。打印信息如下:
$ make clean
rm app main.o fun.o
如果 Makfile 目录中,有名为 clean 文件,make 之后再执行 make clean 又会产生什么呢?
咱们输出 touch clean 产生一个空的文件,再执行 make clean,察看景象
$ touch clean
$ make clean
$ make: 'clean' is up to date.
此时 make 揭示 clean 文件是最新的,而不是执行革除操作。
要解决这个问题,咱们就得引入伪指标。
伪指标
伪指标采纳 ”.PHONY” 关键字来定义,且必须是大写字母。批改一下下面的 Makefile
.PHONY:clean
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
输出 make clean,咱们会发现此时可能失常执行革除操作。
makefile 内容的正文
在 Makefile 文件中,有些内容咱们须要写一下备注,或者临时不须要了,想正文掉,须要怎么操作呢。很简略,只须要在须要正文的那行后面加上 #号即可,像上面这样
# 这是的 Makefile 的正文
#all: main.o fun.o
.PHONY:clean
all: main.o fun.o
gcc -o app main.o fun.o
main.o : main.c
gcc -o main.o -c main.c
fun.o : fun.c
gcc -o fun.o -c fun.c
clean:
rm app main.o fun.o
本文所介绍的 Makefile,应酬几个文件的编译还能够,在理论的工程中,会有几十个、上百个文件。要是都一个个这样按文件名书写,效率太低,且不好保护。前面的文章,我将会介绍 Makefile 的变量和函数,利用它们,咱们的 Makefile 能够大大晋升效率,且便于保护。