C语言程序在存储及运行两种状态下的内存分区

知识碎片之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”)
可执行程序在运行过程中根据需要从动态库中导入相关函数,为此动态库不可丢弃,同时可执行程序运行时占用内存相对较少

相关文章:

  • 2021-11-24
  • 2021-11-04
  • 2021-11-04
  • 2021-10-17
  • 2021-11-04
  • 2021-10-04
  • 2021-04-16
  • 2021-11-30
猜你喜欢
  • 2021-12-09
  • 2018-08-22
  • 2021-09-12
  • 2021-10-17
  • 2021-11-04
  • 2021-11-04
  • 2021-05-04
  • 2021-08-13
相关资源
相似解决方案