了解Linux的gcc,make,gdb

(1)gcc编译
【1】gcc 强大之处在于:平台适应性好,编译语言多,效率高。
通过“gcc -v”命令可以查看详细信息。

【2】格式
gcc [选项] [文件名] [选项] [文件名]

【3】选项类型
按类型把选项分为以下几类:
总体选项:用于控制编译的整个流程
常用选项:
-c:对源文件进行编译或汇编
-E:对文件进行预处理
-S:对文件进行编译
-o file:输出目标文件file
-v:显示编译阶段的命令
语言选项:用于支持各种版本的c语言程序
常用选项:
-ansi:支持符合ASNI标准的c程序
警告选项:
-W:屏蔽所有的警告信息
-Wall:显示所有类型的警告信息
-Werror:出现任何警告信息就停止编译
调试选项:用于控制调试信息
常用选项:
-g:产生调试信息
优化选项:用于对目标文件进行优化
常用选项:
-01:对目标文件的性能进行优化
-02:在-01的基础上进一步优化,提高目标文件的运行性能
-03:在-02的基础上进一步优化,支持函数集成优化
-00:不进行优化
连接器选项:用于控制链接过程
-static:使用静态链接
-llibrary:链接library函数库文件
-L dir:指定连接器的搜索目录dir
-shared:生成共享文件
目录选项:用于指定编译器的文件搜索目录
常用选项:
-Idir:指定头文件的搜索目录
-Ldir:指定搜索目录dir

【4】工作流程:预处理,编译,汇编,链接

预处理阶段:(将头文件加载到程序首部)
1.创建test.c
2.gcc -E test.c -o test.i 参数-E进行预编译,-o输出test.i文件

编译阶段:(检查文件错误)
1.编译阶段三个步骤:词法分析(检查关键字标识符是否正确) 语法分析(检查程序中语句语法是否正确) 语义分析(检查程序中语句逻辑意义是否正确)
2.gcc -S test.i -o test.s 参数S进行编译,-o输出test.s文件

汇编阶段:(将程序翻译成CPU可以识别的二进制文件)
1.gcc -c test.s -o test.o 参数c进行汇编,-o输出test.o文件
链接阶段:(将程序中所有目标文件与所需库文件链接在一起)
1.gcc test.o -o test 得到名为test的可执行文件
2. ./test执行文件

【5】Glibc:
函数库使用方式:静态链接和动态链接
静态链接:在编译阶段把程序中的目标文件和函数库文件链接在一起(静态库),文件体积大,但运行效率高
动态链接:在程序运行过程中需要使用才链接函数库。文件体积小,不包含库文件,但运行时需要动态加载函数库(动态库),运行效率低一点。
多个源文件需要调用函数,应用动态链接
少数源文件需要调用函数,应用静态链接
调用函数库时,要应用相应的头文件,还会加入某些函数库的链接参数

(2)make工程管理器:
【1】实际开发过程中仅仅使用gcc命令编译是非常低效的:多个源文件组成,调试工作量占比高
Make工程管理器:命令“make”进行编译,只需要对需要修改的源文件进行修改,最后make编译时会检查时间戳(每个文件的修改时间),只对被修改的源文件进行编译和链接
注:确保虚拟机CMOS时间正确

【2】Make工程管理器是根据Makefile文件中的编译规则命令进行工作
格式:target file(目标文件):dependency file (依赖文件)
command(规则命令)
依赖规则检查;检查每个依赖文件的时间戳,如果依赖文件时间戳比目标文件要新,就会执行目标文件的规则命令来重新生成目标文件

【3】程序实例如下:
a.h:
在这里插入图片描述
b.c:
在这里插入图片描述
d.c:
在这里插入图片描述
makefile:
在这里插入图片描述
然后“make”命令编译
在这里插入图片描述
【4】嵌套执行:将所有源文件编译规则命令都写在一个Makefile中太臃肿,需要把Makefile分解成多个子Makefile
1.现在其他目录下创建一个子Makefile
2.修改总控Makefile

【5】条件判断:Make工程管理器可以在运行时对条件进行判断,然后进入条件分支继续编译
格式:
条件表达式:
如果真执行的文本
else
如果假执行的文本
Endif
条件表达式四种格式:
Ifeq(参数1,参数2)(比较参数值是否一样,相同为真,相异为假)
Ifneq(参数1,参数2)(比较参数值是否一样,相异为真,相同为假)
Ifdef(参数)(参数非空为真,空为假)
Ifndef(参数)(参数空为真,非空为假)

【6】函数:格式:$(函数名 参数,参数…)

(3)gdb调试器
对程序进行编译,参数g作用是把调试信息加入生成的可执行文件中
常用命令:
l(list)查看所有代码行数
b 行数(breakpoint)进行断点设置
Info b 查看所有断点情况
r 运行程序(“r 行数”从指定行数开始运行),如果有断点,会停止在断点前一行
p 变量名 查看当前变量的值
s (step)和n(next)让程序一步步往下运行
s:在发生函数调用时进入函数内部运行
n:不会进入函数内部进行

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值