LinuxC高级day04(gcc、gdb、makefile工具)

【1】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

gcc xx.c -o 新名字 :生成一个新名字的可执行文件文件

【2】gdb 调试工具

gcc -g xx.c 生成 a.out

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 退出

【3】make工具

1> 定义

make 工程管理器,顾名思义,是指管理较多的文件 make 工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,他通过读入 makefile 文件的内容来执行大量的编译工作

Makefile 或 makefile 时 make读取的唯一配置文件

 2> makefile 格式

目标:依赖

        命令

注意:

命令前面需要用 TAB 键 理解:通俗一点讲就是 依赖(相当于原材料) -> 命令(加工) -> 目标(产物)

makefile 根据以下步骤编写:

gcc -c xx.c -o xx.o

gcc xx.o -o xx

例:

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> 用 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

 4> makefile 变量

自定义变量

自己定义的变量:一般用大写表示变量名,取变量名的值用$(变量名)

= 递归方式展开

:= 直接赋值(当前的值是什么就立即赋值)

+= 追加的新的值

?= 判断赋值

预定义变量

系统预先定义好的一些变量,可能有默认值也可能没有

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

 自动变量

$< 第一个依赖文件的名称

$^ 所有不重复的依赖文件,以空格分开

$@ 目标文件的完整名称

 例:

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

 make指令

make -s : 隐藏执行的指令

make -C 路径 : 进入指定路径去执行make指令

 

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值