PS:红色字体表示重点,绿色字体表示重要标题,块引用中表示Linux终端中的命令。
1.gcc / g++的安装
命令:sudo apt install gcc /gcc+
2.gcc编译连接
//main.c文件
(1)预编译
①删除所有的“#define”,并且展开所有的宏定义;
②处理所有的条件预编译指令,“#if”,“#ifdef”,“#endif”等;
③处理“#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
④删除所有的注释;
⑤添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
⑥保留所有的#program编译器指令,因为编译器需要使用它们。
gcc -E main.c -o main.i
(2)编译
①词法分析
②语法分析
③语意分析
④代码优化
⑤汇总符号
gcc -S main.i -o main.s
(3)汇编
将汇编指令翻译成二进制格式,生成各个section,生成符号表。
gcc - c main.s -o main.o
(4)链接
①合并各个section,调整section的起始位置和段大小,合并符号表,进行符号解析,给符号分配虚拟地址;
②符号重定位,即在使用符号的地方全部替换成符号的虚拟地址;
gcc main.o -o main
3.编译链接过程
编译连接原理:
(1)main.c通过预编译生成main.i文件;
(2)main.i通过编译生成main.s文件;
(3)main.s通过汇编生成main.o文件;
链接就是将所有的:
.o文件 、.a文件(静态库文件) 、.lib文件、.obj文件链接起来
生成.out文件(ELF格式的可执行文件)
Windows是生成.exe文件
四个阶段如下图所示:
4.执行
如何启动一个进程?
①路径+可执行文件名
②路径+可执行文件名 &
(1)关于一步执行(重点)
四步合为一步:
gcc -o main main.c
(2)关于两步执行
三步合为一步:
gcc -c main.c -o main.o 或者 gcc -c main.c
gcc -o main main.o
gcc可以编译C++文件
gcc -o main.c++ mainc++.cpp -lstdc++(指明用C++的标准库)
(下划线部分是文件的名字)
5.gdb调试
(1)debug版本
(程序员)
在编译阶段会加入某些调试信息
调试信息是在编译的过程中加入到中间文件.o文件的;
(2)release版本
(用户)(发行版本,体积小,没有调试信息)
gcc 默认生成的是release版本。
(3)安装debug(dbg)
命令:sudo apt install dbg
(4)加入调试信息
gcc -o test test.c -g(在编译阶段加的调试信息,非链接阶段)
(5)常用调试命令(重点)
①进入调试:gdb test
②加断点:b+行号
③启动程序:r
④显示代码:l
⑤显示断点信息:info break/info b
⑥删除断点信息:delete 断电编号
⑦单步执行:n
⑧打印:p
⑨自动打印:display
⑩退出:q
⑪进入函数:s
⑫跳入函数:finish
⑬加断点导函数入口处:b+函数名
⑭取消一个display undisplay display的编号
⑮c:继续(continue)
(6)补充命令
①l:显示main函数所在的文件的源代码;
list 文件名:num 显示文件名文件num行上下的源代码;
②b 行号:给指定行添加断点;
b 函数名:给指定函数的第一有效行添加一个断点;
③info break:显示断点信息; delete 断点号:删除指定断点;
④r(run):运行程序;
⑤n(next):单步执行;
⑥c(continue):继续执行,直接执行到下一个断点处;
⑦s:进入将要被调用的函数中执行;
⑧finish:跳出函数;
⑨q:退出调试;
⑩bt:显示函数调用栈;
⑪disable 断点号:将断点设定为无效的,不加断点号,将所有断点设置为无效;
enable 断点号:将断点设定为有效的,不加断点号,将所有断点设置为有效;
⑫p val:打印变量val的值 p &val:打印变量val的地址 p a+b:打印表达式的值;
⑬p arr(数组名):打印数组所有元素的值;
⑭*parr@len:用指向数组的指针打印数组所有元素的值;
⑮display:自动显示,参数和p命令一样;
⑯info display:显示自动显示信息 undisplay+编号:删除指定的自动显示;
⑰ptype val:显示变量类型。
如有错误,敬请指正!
您的点赞与收藏是对我最大的鼓励与支持。