每当做项目工程时,都会有很多源文件要编译,此时编译耗费的时间往往很长,那么如何在linux实现gcc main.c lcd.c adc.c -o main快速编译呢?
下面操作将用到两个函数,这里先介绍下这两个函数的功能作用然后再进行传授代码指令
第一个函数 $(wildcard PATTERN)
注意 : $(wildcard *.c)中,*号是代表.c前面的字符不限制个数,只要是.c格式的都匹配;
第二个函数
$(patsubst PATTER N,REPLACEMENT,TEXT)
功能是把TEXT字符串中的.c格式的字符串改为.s格式的字符串
接下来进入正题开始指令操作:!!!
第一步:在项目工程文件下执行指令 vim makefile
红色部分是我项目工程的路径,存放的要编译的文件目录:adc.c adc.h lcd.c lcd.h main.c
第二步:在打开的makefile里面添加这些指令
**1 TARGET=main
//定义变量代表字符串main,如果需要调用则$(TARGET)
3 MODE=gcc
//定义变量代表字符串gcc,如果需要调用则$(MODE)
5 SRCS= $(wildcard *.c)
//在当前目录下找出所有.c文件名并赋给SRCS变量
7 OBJS=$(patsubst %.c,%.o,$(SRCS))
//把SACS变量的字符串里面的.c替换为.o并赋给OBJS, .c文件本身不会更改
9
(
T
A
R
G
E
T
)
:
(TARGET):
(TARGET):(OBJS) //目标文件:依赖文件 即 main:main.o lcd.o adc.o
tab键 $(MODE) $^ -o $@ // $^表示所有依赖文件名 ,$@表示目标文件名
//即gcc main.o lcd.o adc.o -o main
12 %.o:%.c //目标文件:依赖文件
13 $(MODE) -c $< -o $@ //$<表示第一个依赖文件,下一次递增
15 clean: 清除main main.o lcd.o adc.o文件
16 rm $(TARGET) $(OBJS)**
第三步:编译
指令 make
这样就可以执行指令make进行编译链接了
后期也可以执行指令 make clean 来删除main main.o lcd.o adc.o这些文件
讲解下大体思路:
程序一开始找出.c文件名赋给变量SRCS,然后在SRCS变量里面把.c替换为.o并赋给OBJS,这两个变量现在只是字符串而已,并不是生成目标文件了,然后进行
$(TARGET):/$(OBJS),
$(MODE) $^ -o $@ ,
一开始链接main.o时没有.o文件,于是执行
%.o:%.c
$(MODE) -c $< -o $@
生成main.o文件,然后跳到前面执行指令
$(TARGET):/$(OBJS),
$(MODE) $^ -o $@
这时候进行链接第二个文件lcd.o,同样也没有lcd.o文件,跳到
%.o:%.c
$(MODE) -c $< -o
生成lcd.o文件,然后跟前面一样循环操作直到最后一个依赖文件都编译完毕就正式执行指令
$(TARGET):/$(OBJS),
$(MODE) $^ -o $@
进行链接生成可执行文件main