编译连接过程中每个阶段完成的事情:
-
预编译:
替换注释 宏替换 处理预处理指令
-
编译:
词法语法的解析 代码优化 汇总符号(代码中只有数据和函数会生成符号) .data 初始化不为0的数据 .bss 初始化为0的,或者未初始化的数据 普通的全局变量未初始化在COM中
-
汇编:
翻译成二进制,生成各个段(secation),生成符号表 中间文件的组成 EBL
-
连接:
合并各个段,调整段的起始位置以及大小 合并符号表,进行符号解析,给每个符号分配虚拟地址
只会解析GLOBAL符号,不解析LOACL符号(static)
给符号分配虚拟地址是根据4G的虚拟地址空间 符号重定位为=》》 在.text中所有使用到符号的位置都替换符号分配的虚拟地址
c++支持重载,c不支持重载 原因=》》
调试gdb
-
RElease 和 Debug版本的区别
Debug版本称之为调试版本——程序自己用的版本 其中添加了很多的调试信息,用户单步执行 这个版本的执行文件稍微大一点 RElease版本称之为发行版本———用户使用的版本
gcc与g++的区别
1. gcc如果编译的是 .c 文件,则按照c语言的语法规则编译。如果编译的是 .cpp文件,则按照c++的语法规则编译。
g++不管是.c还是.cpp都是按照c++的语法规则进行编译
2. gcc漠然不会链接c++的库,但g++会!
makefile和make
-
makefile与程序代码没有关系,与项目的功能实现没有关系
-
makefile 的好处:自动化编译,一次写好,永久使用!提高工作效率, 提高编译效率(每次只需要编译修改的文件,未修改的不需要重新编译)
-
make 命令的作用就是识别,解析makefile文件,执行其命令。来完成整个编译过程;
makefile 文件的编译规则
- 对于makefile 文件就是在linux 上创建文件名为makefile 或Makefile 文件