一.环境搭建
1.gcc的安装
1>.切换到管理员模式 sudo su ----> 输入密码
2>.apt install gcc //C语言的编译环境
3>.apt install g++ //c++编译环境的搭建
4>.install update //软件升级
2.gcc分步编译链接
(1)预编译
gcc -E main.c -o main.i
(2)编译
gcc -S main.i -o main.s
(3)汇编
gcc -c main.s -omain.o
(4)链接
gcc main.o -o main
(5)运行
./main
3.编译链接过程
3.1 预编译阶段
a) 删除所有的“#define”,并且展开所有的宏定义;
b) 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;
c) 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
d) 删除所有的注释;
e) 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错
误和警告时显示行号;
f) 保留所有的#pragma 编译器指令,因为编译器需要使用它们。
3.2 编译阶段
词法分析、语法分析、语义分析,代码优化,汇总符号。
3.3 汇编阶段
将汇编指令翻译成二进制格式,生成各个 section,生成符号表。
3.4 链接阶段
a) 合并各个 section,调整 section 的起始位移和段大小,合并符号表,进行符号解析,
给符号分配虚拟地址
b) 符号重定位
4、makefile 和 make
管理工程 实现自动化编译 (和 vs 比较)示例:
对 main.c add.c max.c 三个文件进行编译(注意: gcc 前面必须是 table 建缩进)
make 命令根据 makefile 文件的规则生成可执行程序
二.gdb调试
1.基础调试命令
1>.
l
//显示 main 函数所在的文件的源代码
2>.
list 文件名:num
//显示 filename 文件 num 行上下的源代码
3>.
b 行号
//给指定行添加断点
4>.
b 函数名
//给指点函数的第一有效行添加一个断点
5>.
info
break
//显示断点信息
6>.
delete
断点号
//删除指定断点
7>.
disable 断点号
//将断点设定为无效的,不加断点号,将所有断点设置为无效
8>.
enable 断点号
//将断点设定为有效的,不加断点号,将所有断点设置为有效
9>.
r(run)
//运行程序
10>.
n(next)
//单步执行
11>.
c (
continue
)
//继续执行,直接执行到下一个断点处
12>.
s
//进入将要被调用的函数中执行
13>.
inish
//跳出函数
14>.
q
//退出调试