最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

世界快讯:makefile

来源:博客园

makefile

一、gcc

gcc 是用来编译代码的编译器

编译完后有一些常见的输出文件

.a静态库(文档).c需要预处理的C语言源代码.hC语言源代码的头文件.i经过预处理后的C语言源代码.o目标文件(经过汇编产生).s经过编译后产生的汇编语言代码


(资料图)

编译过程

.c->.i->.s->.o

1、预处理 (.c->.i)

gcc -E hello.c -o hello.i

2、编译(.i->.s)

gcc -s hello.c -o hello.s

3、汇编(.s->.o)

gcc -c hello.c -o hello.o

4、链接(.o->可执行文件)把多个.o链接成一个可执行文件(ELF)

gcc hello.o -o myHello

二、makefile

Linux的过程都是自己可以控制的

在gcc中可以通过将.c文件编译成.o文件

那么如果有多个.c文件呢,这些都要编译成.o文件,这样需要输入多条指令去执行吗?

可以通过 makefile

makefile好处:自动化编译

make命令,需要一个makefile文件

在makefile文件中去告诉make命令需要怎样去编译和连接程序

makefile是一个文件形式的数据库文件,包含一些规则来告诉make处理哪些文件以及如何处理这些文件

makefile规则:

target:dependcommand

target:目标,可以是一个中间文件,也可以是最终的执行文件depend:依赖,指要生成目标文件所需要的文件或目标command:make需要执行的命令(一定用tab键)

hello.i:hello.cgcc -E -o hello.i hello.c//注意代码前面一定用table隔开

makefile执行顺序:

默认执行第一条,在执行第一条时,先找所有的依赖文件,如果没有,继续往下找有没有脚本能生成这个依赖文件,如果有就会先执行下面生成依赖文件的语句

test:prog.o code.ogcc -o test prog.o code.oprog.o:prog.c gcc -c prog.c -o prog.ocode.o:code.c gcc -c code.c -o code.oclean://clean:伪目标  清除.o文件rm -f *.o test

makefile变量:

变量理解为字符串

OBJ = a b c 表示 OBJ 就是 a b c 这三个,不能改变了OBJ := a b c 表示 OBJ 是 a b c 但可以用 += 再去追加OBJ += d表示 OBJ 变量添加了 d 这一个

变量引用:$(变量名)

OBJ:=myadd.o mysub.oOBJ+=myproject.omyProject:$(OBJ)gcc $(OBJ) -o myProjectmyadd.o:myadd.cgcc -c myadd.c -o myadd.omysub.o:mysub.cgcc -c mysub.c -o mysub.omyproject.o:myproject.cgcc -c myproject -o myproject.oclean:rm *.o myProject

通配符:

通配符:% * ?% 表示任意一个* 表示所有? 表示匹配一个未知的东西

最终代码:

#OBJ:=myadd.o mysub.o#OBJ+=project1.o#myproject:$(OBJ)#gcc $(OBJ) -o myproject#*.o:*.c#gcc -c *.c -o *.o#.MYDEL://标签,没有实际用处,只是以便区分#clean:#rm -rf *.o myproject#==================================#$@表示目标文件#$^表示依赖文件target=myProjectOBJ:=myadd.o mysub.oOBJ+=myProject.oCC:=gccCFLAGS:=-cLIB:=$(target):$(OBJ)$(CC) $^ -o $@$(LIB)*.o:*.c$(CC) $(CFLAGS) $^ -o $@.MYDEL:#标签,没有实际用处,只是以便区分clean:rm -rf *.o $(target)

关键词: 目标文件 可执行文件 执行文件