静态链接和动态链接是什么?

程序的运行过程分为两个阶段,分别为编译阶段和链接阶段,而编译阶段又分为三部分:预编译,编译,汇编

预编译(生成.i文件) 展开头文件,宏替换,条件编译,去掉注释
编译(生成.s文件) 检查错误,语法分析,生成汇编代码
汇编(生成.0文件) 将汇编代码转换为二进制
链接(生成.exe文件) 合并段表,将目标文件链接到一起

接下来看几个概念
目标文件:在Linux系统下,由编译器将源代码编译后生成的文件叫做目标文件(Linux下的 .o 文件),所以目标文件指的就是源代码编译后但是没有进行链接的中间文件,与可执行文件的区别就是没有进行链接,其它内容与结构都相似
链接器:是一个独立的程序,用来将一个或多个库或目标文件链接到一起生成可执行程序
链接指的是将其它目标文件链接到一起生成可执行文件

概念
静态链接:静态链接是由链接器在链接时将库的内容加入到可执行程序中
动态链接:需要等到程序运行时再将组成程序的目标文件进行链接的过程

当使用静态链接文件链接到一个可执行文件,那么该文件将写入到运行的可执行文件中,而当使用动态链接时,只是指向文件(需要链接的文件)的指针存放到了可执行文件中,注意此时并没有包含链接文件,当运行可执行文件时才会将链接的文件拷贝到内存中,与静态链接不同的是,链接的文件没有写入到磁盘上而是仅拷贝到内存中,所以说动态链接像一种延时链接

静态链接与动态链接的优缺点

优点 缺点
静态链接 不同程序模块可以独立开发和测试,最后完成后链接到一起提供给用户适用,提高了程序开发效率 浪费空间,多进程环境下,每个进程都要保存静态链接函数副本
更新困难,因为链接文件中一个改变后,整个程序都要重新链接
动态链接 当系统多次使用同一个目标文件时,只需要加载一次,节省内存空间 每次程序加载运行时都需要重新进行链接操作,导致性能下降
程序更新更便捷,当需要更新时,只需替换掉旧的目标文件,下次运行时,新版目标文件就会自动装载到内存并链接起来
可以自主选择插件,因为是在程序运行时才进行链接
加强了程序的兼容性,动态链接库相当于在程序和操作系统之间增加了一个中间层,消除了程序对不同平台的依赖性

你可能感兴趣的:(Linux,linux,操作系统)