程序编译分为四个过程
预处理-编译-汇编-链接
预处理-展开所有代码
test.c->test.i
#include 头文件的包含;
#define 宏替换;
注释删除-使用空格来替换注释;
编译-检查错误,将高级语言代码解释为汇编代码
test.i->test.s
语法分析;
词法分析;
语义分析;
符号汇总-函数名/全局变量;
汇编-将汇编代码解释为二进制的机器指令
test.s->test.o
形成符号表:符号-地址;
链接-将所有目标代码由链接器链接在一起,生成可执行程序
test.o->test.exe
符号表的合并和符号表的重定位;
链接分为动态链接和静态链接
动态链接链接动态库,将库中所用到的函数符号信息表记录到可执行程序中;
好处是生成的可执行程序比较小,内存中所有程序共用同一个库,降低了代码冗余;
缺点是运行时需要依赖动态库的存在,要把动态库也加载到内存中;
静态链接链接静态库,直接将静态库中用到的函数写入到可执行程序中;
好处是运行程序时,不需要要依赖库的存在;
缺点是生成的可执行程序比较大,有可能会造成内存冗余;