makefile

makefile

一、gcc

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

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

.a 静态库(文档)
.c 需要预处理的C语言源代码
.h C语言源代码的头文件
.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:depend
command

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

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

makefile执行顺序:

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

test:prog.o code.o
	gcc -o test prog.o code.o
prog.o:prog.c 
	gcc -c prog.c -o prog.o
code.o:code.c 
	gcc -c code.c -o code.o

clean:					//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.o
OBJ+=myproject.o

myProject:$(OBJ)
	gcc $(OBJ) -o myProject
myadd.o:myadd.c
	gcc -c myadd.c -o myadd.o
mysub.o:mysub.c
	gcc -c mysub.c -o mysub.o
myproject.o:myproject.c
	gcc -c myproject -o myproject.o

clean:
	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=myProject
OBJ:=myadd.o mysub.o
OBJ+=myProject.o

CC:=gcc
CFLAGS:=-c
LIB:=

$(target):$(OBJ)
	$(CC) $^ -o $@	$(LIB)
*.o:*.c
	$(CC) $(CFLAGS) $^ -o $@
	
.MYDEL:			#标签,没有实际用处,只是以便区分
clean:
	rm -rf *.o $(target)




posted @ 2023-03-01 22:29  宣哲  阅读(79)  评论(0编辑  收藏  举报