C语言程序在存储及运行两种状态下的内存分区
图片基于黑马训练营day1中图片修改
C语言程序编译过程
| 阶段 | 作用 | 中间文件 | 生成命令 |
|---|---|---|---|
| 源代码 | C/C++源代码文件或者头文件 | .c/.cpp/.h | / |
| 预处理 | 处理宏定义与条件编译,包含文件展开(#include),去除注释 | .i/.ii | gcc -E |
| 编译 | 语法检查并生成汇编代码,这一阶段所有函数的地址已经确定并存入文件,函数调用转化为call指令,call指令后面的地址为指向某条jmp指令,这条jmp后面跟的地址才是原来真正函数的地址 | .s | gcc -S |
| 汇编 | 汇编代码转机器码 | .o | gcc -c |
| 链接 | 链接运行所需的库 | .o | gcc |
| 运行 | 最终的可执行程序 | .exe |
C语言函数链接
| 链接方式 | 文件 | 方法 | 特点 |
|---|---|---|---|
| 静态链接 | .h+.cpp——>.lib (链接时用,称之为静态库,包含有实际执行代码、符号表等等) | #include<testlib.h> #pragma comment(lib,“testlib.lib”) |
在生成可执行文件后静态库可以丢弃,因为所需函数代码已经在编译时置于目标程序中,这也导致目标程序运行时占用内存较大 |
| 动态链接 | .h+.cpp ——> .lib(链接时用,称之为导入库,只包含了地址符号表)+.dll(运行时用,称之为动态库,包含实际的执行代码) | 方法1:LoadLibarary() GetProcAddress() FreeLibrary() 方法2:#include<winsock2.h> #pragma comment(lib,“Ws2_32”) |
可执行程序在运行过程中根据需要从动态库中导入相关函数,为此动态库不可丢弃,同时可执行程序运行时占用内存相对较少 |