我的回答
作为一名C/C++程序员,对于编译链接的过程要了然于胸。首先大概介绍一下,编译分为3步,首先对源文件进行预处理,这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),生成.i文件;然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成.s的汇编文件;最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件。以上就是编译的过程,下面主要介绍两种链接方式—静态链接和动态链接。
静态链接和动态链接两者最大的区别就在于链接的时机不一样,静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时,下面来详细介绍这两种链接方式。
静态链接的缺点很明显,一是浪费空间,因为每个可执行程序中对所有需要的目标文件都要有一份副本,所以如果多个程序对同一个目标文件都有依赖,如多个程序中都调用了printf()函数,则这多个程序中都含有printf.o,所以同一个目标文件都在内存存在多个副本;另一方面就是更新比较困难,因为每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。但是静态链接的优点就是,在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。
动态链接出现的原因就是为了解决静态链接中提到的两个问题,一方面是空间浪费,另外一方面是更新困难。下面介绍一下如何解决这两个问题。
[
](https://blog.csdn.net/kang___xi/article/details/80210717)
参考回答
静态链接就是在程序执行前,把要链接的内容链接 到可执行的文件中,生成一个目标文件
动态链接则是没有将内容拷贝到可执行文件中,而是先加入地址或者引用指针,在执行的过程中再去找要链接的内容。
动态链接有两种方式:
装载时动态链接
在编译前确认链接信息,编译时只保留重要的链接信息,执行时在内存中将其链接如调用程序的执行空间中。目的是便于代码共享
运行时动态链接
在编译前不知道链接信息,在执行时才会加载到内存中,并标识内存地址。目的是只存一份
这个和JS中模块引入一样,如果当前的模块写在当前文件中则是静态链接,而用import引入,则是动态链接。