当前位置: 首页 > news >正文

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.otest:$(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.otest:$(OBJS)$(CC) $^ -o $@
%.o:%.c$(CC) $(CFLAGS) $< -o $@.PHONY:clean
clean:$(RM) test *.o

 make指令

make -s : 隐藏执行的指令

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

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python媒体下载工具 you-get
  • centos安装rclone挂载alist
  • MATLAB中cdf2rdf函数用法
  • Promise如何解决回调地狱问题?
  • 电脑图片损坏打不开怎么办?能修复吗?
  • 大厂进阶之二:React高级用法HOC、Hooks对比、异步组件
  • uniapp多图上传uni.chooseImage上传照片uni.uploadFile
  • ECCV 2024 | 南洋理工三维数字人生成新范式:结构扩散模型
  • (Java入门)抽象类,接口,内部类
  • Win/Mac/Linux/Andriod/IOS界面UI设计 - pyside6 - 01 基础系统框架
  • 超详细!!! LVS(Linux virual server)负载均衡知识及其NAT模式、DR模式、火墙标记实验
  • Hadoop,ActiveMQ,RabbitMQ,Springboot Actuator未授权访问漏洞(附带修复方法)
  • 全网最最最详细的haproxy详解!!!
  • MapReduce入门教程
  • 白骑士的Matlab教学进阶篇 2.1 数据可视化
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • MySQL的数据类型
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • REST架构的思考
  • Spring Cloud Feign的两种使用姿势
  • Swift 中的尾递归和蹦床
  • 回顾 Swift 多平台移植进度 #2
  • 面试遇到的一些题
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何利用MongoDB打造TOP榜小程序
  • 入门级的git使用指北
  • 深度学习在携程攻略社区的应用
  • 使用API自动生成工具优化前端工作流
  • 双管齐下,VMware的容器新战略
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (计算机网络)物理层
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (六)Hibernate的二级缓存
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)母版页和相对路径
  • *上位机的定义
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .jks文件(JAVA KeyStore)
  • .Net 6.0--通用帮助类--FileHelper
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • @SpringBootConfiguration重复加载报错