『面试问答』:静态链接和动态链接的区别是什么?
面试官:请说一下,静态链接和动态链接的区别是什么?
一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)4步才能变成可执行文件。程序代码首先经过预处理器生成 .i 文件。然后通过编译器生成 .s 汇编文件,再通过汇编器生成 .o 目标文件,最后通过链接器链接生成可执行文件。
在链接阶段,根据链接过程中处理方式的不同,链接可以分为静态链接和动态链接。
静态链接是在链接阶段,就把所有需要的函数的二进制代码都包含到可执行文件中去,完成所有符号引用的一种链接方式。
而动态链接在链接的时候不直接拷贝相应依赖库的代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,由操作系统负责将需要的依赖库加载到内存中,然后程序在运行到指定代码时,去执行内存中已经加载的依赖库的代码,最终达到运行时链接的目的。
静态链接和动态链接对应的链接库也不同,可分为两种,分别是静态链接库和动态链接库,在Linux中,静态链接库文件以.a作为文件后缀,动态链接库以.so作为文件后缀。
静态库会在链接阶段将静态库中的代码复制到可执行文件中,当程序在执行的时候,在可执行文件中本身就有了静态库的代码,可以直接调用。
动态库则不会将代码打包到可执行文件中,而是打包动态库的名称等信息,在可执行程序运行的时候,需要去找到动态库的文件,然后把动态库加载到内存中才可以使用动态库中的代码。
静态库被打包到可执行程序中,生成的可执行文件较大,但是程序加载运行速度会比较快,发布程序时,也无需提供静态库,移植比较方便。但是当多个程序链接同一个静态库时,生成的每一个可执行文件中,都会含有这个静态库,相当于在内存中同时运行着两个相同的静态库,比较浪费系统资源。另外,当静态库的内容发生更新时,依赖该静态库的程序也需要重新进行链接,导致程序的更新升级会比较麻烦。
动态库可以实现进程间资源共享,比如可执行程序A在运行时用到了某个动态库,那么系统会将该动态库的代码动态加载到内存中,此时若正在运行的程序B也需要用到该动态库中的代码,则不需要再次加载该动态库,而是可以与程序A共享。此外,当动态库的内容更新时,只需重新编译生成新的动态库即可,而不需要对依赖该动态库的程序重新进行编译链接。
#晒一晒我的offer##软件开发薪资爆料##我的实习求职记录##23届找工作求助阵地#分享软件开发岗位面试题及答案