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)
第五层:函数