【发布时间】:2011-05-08 09:58:36
【问题描述】:
静态链接和动态链接有什么区别?
【问题讨论】:
-
@Andrey:这不是完全重复的。实际上存在三种可能性:静态链接、加载时动态链接和运行时动态链接。另一个问题是问第二个和第三个之间的区别,而这是在谈论第一个和第二个和第三个加在一起的一组之间的区别。
标签: dll
静态链接和动态链接有什么区别?
【问题讨论】:
标签: dll
在静态链接中,在外部库文件中定义的函数和变量会链接到您的可执行文件中。这意味着代码在编译/链接时实际上与您的代码相关联。
通过动态链接,您在软件中使用的外部函数不会链接到您的可执行文件。相反,它们驻留在仅由您的软件引用的外部库文件中。即:编译器/链接器指示软件在哪里找到使用的函数。
在 Windows 平台上,您甚至可以在运行时显式加载 DLL 文件并连接 DLL 中包含的函数。
【讨论】:
静态链接是在“编译时”由称为链接器的工具完成的。动态链接是在运行时由操作系统完成的。
静态链接会增加程序的文件大小,如果系统上正在运行其他应用程序,它可能会增加内存中的代码大小... 另一方面,动态链接程序占用的空间和虚拟内存更少
【讨论】:
在编译时链接的静态链接库中,但是当你这个静态链接时代码量更大,当你只有一个或两个程序时,你使用静态链接
在运行时(或)执行时链接的动态链接库中,但代码量较小,当您有更多程序时,请使用动态链接。
【讨论】:
execution time和run time有什么区别?
如果我们用静态和动态链接编译简单的 helloworld 程序,我们很容易看到如下大小差异,
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello World !");
return 0;
}
创建一个动态链接的可执行文件,
$ gcc -o helloworld helloworld.c
另外,创建一个静态链接的可执行文件,
$ gcc -o helloworld_static helloworld.c -static
$ ls -alh helloworld -rwxrwxr-x 1 myuser myuser 7.2K Sep 2 21:08 helloworld
$ size helloworld 文本数据 bss dec 十六进制文件名 1124 276 4 1404 57c
$ ls -alh helloworld_static -rwxrwxr-x 1 myuser myuser 712K Sep 2 21:08 helloworld_static
$ size helloworld_static 文本数据 bss dec 十六进制文件名 658287 4096 3644 666027 a29ab helloworld_static
因此,执行简单的helloworld程序的观察结果如下,
与动态链接的可执行文件相比,静态链接的可执行文件需要更多空间。这是静态链接的缺点和动态链接的优点。
对于动态链接的可执行文件,只有一个共享库副本驻留在内存中。如果多个进程同时调用共享库的同一个对象模块,它们都使用该库的同一个副本。而对于静态链接,库的所有使用对象都被复制到每个可执行文件中。因此,对于每个不同的进程,每个库对象的副本都驻留在内存中。这导致静态链接的可执行文件比动态链接的可执行文件使用更多的 RAM。
动态链接有更多系统调用,这意味着动态链接的可执行文件将需要更多时间来运行/执行。
如果您想要更广泛的解释,在程序执行期间使用strace 进行实际系统调用跟踪,您可以visit a page I wrote about this issue on my website。
【讨论】: