6.S081:2.makefile初体验


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就写好啦~


Author: Paranoid
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Paranoid !
评论
  TOC