2021-06-23

linux下文件编译过程

1.linux下使用gcc把单个.c文件编译成可执行文件的过程

预处理:将.h 文件、.c文件、库文件、宏定义展开形成一个文件,生成 .i 文件。
执行的命令:gcc -E hello.c -o hello.i

编译:将得到的 .i 文件翻译成 汇编代码 .s 文件
执行的命令:gcc -S hello.i -o hello.s

汇编:将汇编文件 .s 文件翻译成机器指令,并打包成 .o文件
执行的命令:gcc -c hello.s -o hello.o (注意:这里是小写的-c,而不是大写的-C)

链接:将二进制文件链接成为一个可执行的文件
执行的命令:gcc hello.o -o hello

运行可执行文件:./hello

2.linux下多文件编译-makefile

首先建立一个Makefile文件。
第一层:显示规则
(1)目标文件:依赖文件
[TAB]指令
例:

hello.i:hello.c
	gcc -E hello.c -o hello.i
hello.s:hello.i
	gcc -S hello.i -o hello.s
hello.o:hello.s
	gcc -c hello.s -o hello.o 
hello:hello.o
	gcc hello.o -o hello

(2)第一个目标文件是我的最终目标、

hello:hello.o
	gcc hello.o -o hello
hello.o:hello.s
	gcc -c hello.s -o hello.o 
hello.s:hello.i
	gcc -S hello.i -o hello.s
hello.i:hello.c
	gcc -E hello.c -o hello.i	

(3)伪目标: .PHONY

hello:hello.o
	gcc hello.o -o hello
hello.o:hello.s
	gcc -c hello.s -o hello.o 
hello.s:hello.i
	gcc -S hello.i -o hello.s
hello.i:hello.c
	gcc -E hello.c -o hello.i
.PHONY:
clear:
	rm -rf hello.o hello.s hello.i hello

clear可以随便起名。
命令行中直接make,则会执行上述代码中的指令

gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o 
gcc hello.o -o hello

命令行中直接ls,会发现有如下文件
hello.o hello.s hello.i hello hello.c Makefile
命令行中直接make clear,则会执行上述代码中的指令

rm -rf hello.o hello.s hello.i hello

命令行中ls,会发现有如下文件
hello.c Makefile
例:
假设现在有一个test文件夹,文件夹内有如下文件:circle.c circle.h cube.c cube.h main.c main.h
Makefile文件内容:

#得到可执行文件test  省去汇编  编译
test:circle.o cube.o main.o
	gcc circle.o cube.o main.o -o test
circle.o:circle.c
	gcc -c circle.c -o circle.o
cube.o:cube.c
	gcc -c cube.c -o cube.o
main.o:main.c
	gcc -c main.c -o main.o
.PHONY:
clearall:
	rm -rf circle.o cube.o main.o test
clear:
	rm -rf circle.o cube.o main.o

命令行中先执行 make , ls发现生成了 circle.o cube.o main.o test ,再执行 ./test 会运行可执行程序test ,输出程序运行结果; 执行 make clear,ls 会发现删除了 circle.o cube.o main.o文件:执行make clearall, ls 会发现删除了circle.o cube.o main.o test 文件。

第二层:变量
= 表示替换
+= 表示追加
:= 表示恒等于
使用变量 $(变量名)

TAR = test
OBJ = circle.o cube.o main.o
CC := gcc

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)
circle.o:circle.c
	$(CC) -c circle.c -o circle.o
cube.o:cube.c
	$(CC) -c cube.c -o cube.o
main.o:main.c
	$(CC) -c main.c -o main.o
.PHONY:
clearall:
	rm -rf $(OBJ) $(TAR)
clear:
	rm -rf $(OBJ)

第三层:隐含规则
%.c %.o :任意的.c或者.o文件
*.c *.o:所有的.c或者.o文件

TAR = test
OBJ = circle.o cube.o main.o
CC := gcc

$(TAR):$(OBJ)
	$(CC) $(OBJ) -o $(TAR)
%.o:%.c
	$(CC) -c  %.c  -o  %.o
.PHONY:
clearall:
	rm -rf $(OBJ) $(TAR)
clear:
	rm -rf $(OBJ)

第四层:通配符
$^ 所有的依赖文件
$@所有的目标文件
$< 所有的依赖文件的第一个文件

TAR = test
OBJ = circle.o cube.o main.o
CC := gcc
RFRM:=rm -rf
$(TAR):$(OBJ)
	$(CC) $^ -o $@
%.o:%.c
	$(CC) -c  $^  -o  $@
.PHONY:
clearall:
	$(RFRM) $(OBJ) $(TAR)
clear:
	$(RFRM) $(OBJ)

第五层:函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值