编译工具
一.gcc 编译工具
预处理:#开头内容,展开头文件,替换宏定义,不会进行语法检查。
gcc -E xx.c -o xx.i
编译:检查语法错误,词法错误,将.i文件转换成.s汇编文件。
gcc -S xx.i -o xx.s
汇编:将汇编文件转换成二进制文件(不可执行)
gcc -c xx.s -o xx.o
链接:链接库文件,将不可执行的二进制文件转换成可执行的二进制文件。
gcc xx.o -o xx
gcc xx.c 默认生成a.out
-o: 生成一个新名字的可执行文件
二.gdb调试工具
1)gcc -g xx.c 生成 a.out
2)gdb a.out
r: 运行代码
l: 查看文件
b 行号或者函数名:添加断点
info b:查看断点情况
d num(断点编号):删除断点
p 变量名:查看变量的值
s/n: 单步运行,s会进入子函数顺序执行;单步跳过,n不会进入子函数
c: 执行到下一个断点的位置
help:帮助
q: 退出
步骤:
代码写好后,先通过gcc -g进行编译代码,没有错误后,可以通过gdb a.out进行调试,输入l查看文件内容,通过b设置断点,输入r进行运行,n或s进行单步调试,q退出
三.make工具
3.1 定义
make:工程管理器,顾名思义,是指管理较多的文件
make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。
Makefile或makefile时make读取的唯一配置文件。
3.2 makefile格式
目标:依赖
命令
注意:命令前面需要用TAB键
理解:通俗一点讲就是 依赖(相当于原材料) -> 命令(加工)-> 目标(产物)
makefile根据以下步骤编写:
gcc -c xx.c -o xx.o
gcc xx.o -o xx
例如:写一个test.c,再写一个makefile文件
test:test.o
gcc test.o -o test
test.o:test.c
gcc -c test.c -o test.o
使用make命令执行,会默认找第一个目标来生成
目标加:是伪目标
伪目标:它的目的并不是创建目标文件(所以称作“伪”),而是想去执行这个目标下面的命令。
例如:添加删除功能
test:test.o
gcc test.o -o test
test.o:test.c
gcc -c test.c -o test.o
.PHONY:clean
clean:
rm test test.o
执行:make clean
规则中 rm 命令不是为了创建 clean 这个文件,而是执行删除某些文件的任务。当工作目录中不存在以 clean 命令的文件时,输入 make clean 命令,命令 rm test test.o 总会被执行 ,这也是我们期望的结果。
如果避免同名文件可以加:.PHONY:clean 不然如果当前目录下有名字叫clean的文件会报:make: “clean”已是最新。
3.3 用make管理多个文件
先分文件:
makefile:
test:main.o test.o
gcc main.o test.o -o test
main.o:main.c
gcc -c main.c -o main.o
test.o:test.c
gcc -c test.c -o test.o
.PHONY:clean
clean:
rm test *.o
执行:make
清除中间文件以及可执行文件:make clean
.PHONY:clean 为了避免路径中有同名文件clean
3.4 makefile变量
3.4.1 自定义变量
自己定义的变量:一般用大写表示变量名,取变量的值用$(变量名)
给变量赋值:
= 递归方式展开
:= 直接赋值(当前的值是什么就立即赋值)
+= 追加新的值
?= 判断之前是否定义,如果定义了,不重新赋值,否则赋值
3.4.2 预定义变量
系统预先定义好的一些变量,可能有默认值可能没有默认
RM 文件删除程序的名称,默认值为rm -f
CC C编译器的名称,默认值为cc。
CPP C预编译器的名称,默认值为$(CC) –E。
CFLAGS C编译器的选项,无默认值。
OBJS 生成的二进制文件或目标文件,自己定义
CC=gcc
CFLAGS=-c -g -Wall #-c编译 -g加调试 -Wall显示警告
OBJS=main.o test.o
#CC=arm-linux-none-gnueabi-gcc #交叉编译链
test:$(OBJS)
$(CC) $(OBJS) -o test
main.o:main.c
$(CC) $(CFLAGS) main.c -o main.o
test.o:test.c
$(CC) $(CFLAGS) test.c -o test.o
.PHONY:clean
clean:
$(RM) test *.o
3.4.3 自动变量
$< 第一个依赖文件的名称
$^ 所有不重复的依赖文件,以空格分开
$@ 目标文件的完整名称
CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o test.o
test:$(OBJS)
$(CC) $^ -o $@
main.o:main.c
$(CC) $(CFLAGS) $< -o $@
test.o:test.c
$(CC) $(CFLAGS) $< -o $@
.PHONY:clean
clean:
$(RM) test *.o
可以用%.c和%.o代替每一个.c和.o文件: 相当于让每个.c生成各自的.o
CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o test.o
test:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) $< -o $@
.PHONY:clean
clean:
$(RM) test *.o
3.5 make指令
make -s: 隐藏执行的指令
make -C 路径:进入指定路径去执行make指令
总结:
标签:文件,gcc,make,高级,day04,编译,clean,test,main From: https://blog.csdn.net/QR70892/article/details/141230629