猿问

“静态链接”和“动态链接”是什么意思?

“静态链接”和“动态链接”是什么意思?

我经常听到“静态链接”和“动态链接”这两个术语,通常用CC ++C#编写的代码。他们是什么,他们到底在说什么,他们连接的是什么?



慕桂英546537
浏览 1954回答 3
3回答

呼如林

我认为一个好的答案,这个问题应该解释链接什么是。当您编译一些C代码(例如)时,它将被转换为机器语言。只是一个字节序列,当运行时,会导致处理器添加,减去,比较,“转到”,读取内存,写入内存等等。这些东西存储在对象(.o)文件中。现在,很久以前,计算机科学家发明了这种“子程序”的东西。执行 - 这 - 块-的代码和回报 - 在这里。不久之后,他们意识到最有用的子程序可以存储在一个特殊的地方,并被需要它们的任何程序使用。现在,在早期,程序员必须打入这些子程序所在的内存地址。有点像CALL 0x5A62。如果需要更改那些内存地址,这是繁琐且有问题的。因此,该过程是自动化的。你编写一个调用的程序,printf()编译器不知道的内存地址printf。所以编译器只是写入CALL 0x0000,并在对象文件中添加一条注释,说“必须将此0x0000替换为printf的内存位置”。静态链接意味着链接器程序(GNU的一个名为ld)将printf机器代码直接添加到可执行文件中,并将0x0000更改为地址printf。创建可执行文件时会发生这种情况。动态链接意味着上述步骤不会发生。可执行文件仍然有一个注释“必须用printf的内存位置替换0x000”。每次运行程序时,操作系统的加载程序都需要找到printf代码,将其加载到内存中并更正CALL地址。程序调用一些静态链接的函数(标准库函数,如printf通常是静态链接的)和其他动态链接的函数是很常见的。静态的“成为可执行文件的一部分”,动态的“加入”可执行文件运行时。这两种方法都有优点和缺点,操作系统之间也存在差异。但既然你没有问,我会在这里结束。

慕田峪9158850

静态链接库在编译时链接。动态链接库在运行时加载。静态链接将库位烘焙到您的可执行文件中。动态链接仅烘焙对库的引用; 动态库的位存在于别处,可以在以后换出。
随时随地看视频慕课网APP
我要回答