初识Linux:Linux开发工具gcc/g++和gdb以及Makefile的使用
目录
编辑
1.gcc/g++的用处(作用)
2.gcc/g++的语法使用
3.gdb的用处(作用)
4.gdb的命令大汇总(包含大部分常用命令)
5.make/Makefile
1.gcc/g++的用处(作用)
gcc/g++是GNU开发的C/C++编译器,编译过程通常包含以下四个步骤:
(1)预处理
预处理阶段处理源代码中的宏定义、头文件包含、条件编译等指令。预处理器(cpp)将#include
的文件内容插入到源文件中,替换#define
定义的宏,并处理#ifdef
等条件编译指令。生成.i
(C)或.ii
(C++)文件。
(2)编译
编译阶段将预处理后的代码转换为汇编代码。编译器(gcc/g++)进行词法分析、语法分析、语义分析及优化,生成与平台相关的汇编语言文件(.s
)。
eg:
movl $1, %eax
(3)汇编
汇编器(as)将汇编代码转换为机器指令(二进制目标文件.o
或.obj
)。此阶段逐行翻译汇编指令为可被CPU直接执行的机器码,生成目标文件。
(4)链接
链接器(ld)将多个目标文件及库文件合并为最终的可执行文件(如a.out
)。解决符号引用(如函数调用),合并代码段和数据段,并处理静态库(.a
)或动态库(.so
/.dll
)的依赖关系。
以上步骤代码执行的显示如下图:
gcc -E source.c -o output.i # 预处理
gcc -S output.i -o output.s # 编译
gcc -c output.s -o output.o # 汇编
gcc output.o -o program # 链接
2.gcc/g++的语法使用
- -E:仅执行预处理
- -s:只进行预处理和编译
- -c:指示编译器只进行编译而不进行链接。
- 注意事项:目标文件需通过后续链接步骤生成可执行文件。若省略
-c
且未指定-o
,GCC 会尝试生成名为a.out
的可执行文件。 - -o:用于指定输出文件的名称
- -g:生成调试信息
- -static:生成的文件采用静态链接。
- 注意:gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。
3.gdb的用处(作用)
gdb是一款功能强大的程序调试工具!!!!
gdb的主要功能包括:
- 程序调试:支持设置断点、单步执行、变量监控等调试操作
- 错误诊断:帮助定位程序崩溃、内存泄漏等问题的根源
- 代码审查:可以查看程序执行过程中的函数调用栈和变量状态
- 性能分析:通过调试信息分析程序运行时的性能瓶颈
- 逆向工程:可用于分析二进制程序的执行流程
- 多线程调试:支持调试多线程应用程序
- 跨平台支持:可在多种操作系统和硬件架构上使用
在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。
4.gdb的命令大汇总(包含大部分常用命令)
运行程序:
run/r [args] # 运行程序(可带参数)
start # 运行到main函数暂停
continue/c # 继续运行程序
next/n # 单步执行(跳过函数调用)
step/s # 单步执行(进入函数调用)
until [location] # 运行到指定位置
finish # 执行完当前函数并暂停
断点管理:
break/b [location] # 设置断点(函数名/行号/地址)
tbreak # 设置临时断点
watch [expr] # 监视表达式变化
catch [event] # 捕获特定事件(如throw)
info breakpoints # 查看所有断点
delete [num] # 删除断点
disable/enable [num] # 禁用/启用断点
显示操作:
list/l # 显示源代码
list [function] # 显示特定函数源码
list [file]:[line] # 显示特定文件行数
directory [path] # 添加源代码搜索路径
print/p [expr] # 打印表达式值
print/x # 十六进制格式打印
print/d # 十进制格式打印
print/t # 二进制格式打印
display [expr] # 每次停止时自动显示
undisplay [num] # 取消自动显示
退出与启动gdb:
gdb [executable] # 启动GDB并加载可执行文件
gdb -p [pid] # 附加到正在运行的进程
quit/q # 退出GDB
5.make/Makefile
(1)了解make/Makefile
• 会不会写makefile,从⼀个侧面说明了⼀个⼈是否具备完成大型工程的能力。
• ⼀个⼯程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了⼀ 系列的规则来指定,哪些⽂件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚中至 于进行更复杂的功能操作
• makefile带来的好处就是⸺“自动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全自动编译,极大的提⾼了软件开发的效率。
• make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,大多数的IDE都有这 个命令,比如:Delphi的make,VisualC++的nmake,Linux下GNU的make。可见,makefile 都成为了⼀种在⼯程方面的编译方法。
• make是⼀条命令,makefile是⼀个文件,两个搭配使用,完成项目自动化构建。
(2)使用make和Makefile
上图的依赖关系:
上面的文件myproc,它依赖myproc.c
依赖方法:
那么当仅输入make命令时,其默认工作方式如下:
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第⼀个目标文件(target),在上面的例子中,他会找到个文件,并把这个文件作为最终的目标文件。
3. 如果 myproc 文件不存在,或是比my myproc 所依赖的后面的 proc 这个文件新(可用 myproc 这 myproc.o 文件的文件修改时间要 touch 测试),那么,他就会执行后⾯所定义的命令来生成 myproc 这个文件。
4. 如果 myproc 所依赖的 myproc.o 文件不存在,那么 make 会在当前⽂件中找目标为 myproc.o 文明件的依赖性,如果找到则再根据那⼀个规则生成 myproc.o 文件。(这有点像⼀ 个堆栈的过程)
5. 当然,你的C文明件和H文件是存在的啦,于是 myproc.o 文件声明 make 会生成 myproc.o 文件,然后再用 make 的终极任务,也就是执行文件 hello 了。
6. 这就是整个make的依赖性,make会⼀层又一层地去找文件的依赖关系,直到最终编译出第⼀个 目标⽂件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并 报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对 不起,我就不工作啦。
项目是需要被清理的:
• ⼯程是需要被清理的
• 像clean这种,没有被第⼀个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动 执行,不过,我们可以显示要make执行。即命令⸺“makeclean”,以此来清除所有的目标文件,以便重编译。
• 但是⼀般我们这种clean的目标文件,我们将它设置为伪目标,用.PHONY 修饰,伪目标的特性是,总是被执行的。
注意:
$@: 代表⽬标文件名。
$^: 代表依赖文件列表
$(RM): 替换,用变量内容替换它
eg:
好了初步linux的内容已经结束啦,谢谢你的观看!!!!!觉得好的话点赞加收藏哦!