1.gcc,g++,gdb安装
命令行写gcc,g++,gdb根据提示安装:sudo apt install gcc/g++/gdb
2.gcc分布编译链接
(1)预编译: gcc -E main.c -o main.i (2)编译: gcc -S main.i -o main.s (3)汇编: gcc -c main.s -o main.o (4)链接 gcc main.o -o main 执行: ./main 或者:全路径/main
3.编译链接过程
编译链接原理:
main.c通过预编译生成main.i文件
main.i通过编译生成main.s文件
main.s通过汇编生成main.o文件(可重定位的二进制目标文件)
链接阶段就是将所有的.o文件, .a文件(静态库文件), .lib文件, .obj文件链接起来,生成.out文件(ELF格式的可执行文件) (Windows是生成.exe文件)
预编译生成.i文件(第一步),编译生成.s文件(第二步),即编译生成汇编指令,然后接下来
**当然就是汇编了,对汇编指令进行汇编,生成.o文件(第(3)步),即变成二进制指令(第(3) 步),最后就是链接了(第四步)**
参考书目及拓展:程序员的自我修养 2.1章 37页
(1)预编译阶段
a)删除所有的"#define",并且展开所有的宏定义;
b)处理所有的条件预编译指令,"#if","#ifdef","#endif"等;
c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
d)删除所有的注释;
e)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错 误和警告时显示行号;
f)保留所有的#pragma编译器指令,因为编译器需要使用它们;
(2)编译阶段 词法分析,语法分析,语义分析,代码优化,汇总符号
(3)汇编阶段: 将汇编指令翻译成二进制格式,生成各个section,生成符号表.
(4)链接阶段
1)合并各个section,调整section的起始位移和段大小,合并符号表,进行符号解析,给符号分配虚拟地址;
2)符号重定位,即在使用符号的地方全部替换成符号的虚拟地址;
4.执行
路径+可执行文件名
两步:gcc -c main.c -o main.o 或者 gcc -c main.c
gcc -o main main.o gcc -o main main.c/main.o
一步:gcc -o main main.c
./main