6.S081:2.makefile初体验
1.什么是makefile?
makefile能实现自动编译
,对多文件
的大工程项目,使用makefile可以事半功倍,可以省去许多编译、链接
命令,在许多IDE
中,通常不需要程序员使用命令行来编译源文件,而是点击一个编译运行按钮即可生成可执行文件,原因就是使用了makefile来进行自动编译
2.一个简单的例子
对于一个C语言源程序hello.c
#include <stdio.h>
int main(){
printf("hello makefile!\n");
return 0;
}
要想让这段程序能运行起来,需要经过以下几个步骤:
- 预处理
- 编译
- 汇编
- 链接
对于单个C语言源文件可以以下编译命令来生成一个hello.out的可执行文件
gcc -chello.c -o hello
3.一个复杂的例子
对于多个C语言源程序
//----------f1.h------------
#ifndef F1_H
#define F1_H
void func1();
#endif
//----------f1.c------------
#include <stdio.h>
#inlcude "f1.h"
void func1(){
printf("f1\n");
}
//----------f2.h------------
#ifndef F2_H
#define F2_H
void func2();
#endif
//----------f2.c------------
#include <stdio.h>
#inlcude "f2.h"
void func2(){
printf("f2\n");
}
//----------main.c------------
#include "f1.h"
#include "f2.h"
int main(){
func1();
func2();
return 0;
}
可以看到main.c
包含两个头文件f1.h、f2.h
,要想的到一个可执行文件,需要先得到三个可重定位目标文件
main.o、f1.o、f2.o,然后将三者链接
起来生成可执行文件,具体来说分为以下几条命令
gcc -c f1.c -o f1.o
gcc -c f2.c -o f2.o
gcc -c main.c -o main.o
gcc main.o f1.o f2.o -o twoballs
这样即可生成可执行文件twoballs,看着好像也不复杂,但是如果对f1.c进行修改,那么下次要运行twoballs程序时就要重新编译,再输入这四条命令,这样十分低效。
4.编写一个简单的makefile
makefile的语法格式如下:
target: code code code
command
上一小节的例子写成makefile格式如下:
twoballs: main.o f1.o f2.o
gcc main.o f1.o f2.o -o twoballs
main.o: main.c
gcc -c main.c -o main.o
f1.o: f1.c
gcc -c f1.c -o f1.o
f2.o: f2.c
gcc -c f2.c -o f2.o
clean:
rm twoballs main.o f1.o f2.o -rf
输入make
,即可生成twoballs
5.编写一个有逼格的makefile
我们将上一节的makefile再修改一下,显得专业一点,让别人看不懂
#定义,引用定义时,格式为:$(VAR)
OBJ = main.o f1.o f2.o
CC = gcc
RM = rm -rf
ALL = twoballs
# $^表示上一行的所有依赖, $@表示目标文件
$(ALL): $(OBJ)
$(CC) $^ -o $@
%.o: %.c
$(CC) -c $^ -o $@
clean: $(OBJ) $(ALL)
$(RM) $^
这样一个有逼格的makefile就写好啦~