静态链接和动态链接有什么区别?
答案 0 :(得分:15)
在静态链接中,外部库文件中定义的函数和变量在可执行文件中链接。这意味着代码在编译/链接时实际上与您的代码相关联。
使用动态链接,您在软件中使用的外部函数不会与可执行文件链接。相反,它们驻留在外部库文件中,这些文件仅由您的软件引用。即:编译器/链接器指示软件在哪里找到使用的函数。
在Windows平台上,您甚至可以在运行时显式加载DLL文件并连接DLL中包含的函数。
答案 1 :(得分:11)
静态链接在“编译时”由称为链接器的工具完成。动态链接在运行时由操作系统完成。
答案 2 :(得分:2)
静态链接会增加程序的文件大小,如果系统上运行其他应用程序,它可能会增加内存中的代码大小... 另一方面,动态链接程序占用的空间更少,虚拟内存更少
答案 3 :(得分:0)
在编译时链接的静态链接库中,但是当你进行静态链接时代码大小更多,当你只有一两个程序然后你使用静态链接时
在运行时(或)执行时链接的动态链接库中,但代码大小较小,当您有更多程序时,则使用动态链接。
答案 4 :(得分:0)
如果我们使用静态和动态链接编译简单的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 text data bss dec hex filename 1124 276 4 1404 57c helloworld
$ ls -alh helloworld_static -rwxrwxr-x 1 myuser myuser 712K Sep 2 21:08 helloworld_static
$ size helloworld_static text data bss dec hex filename 658287 4096 3644 666027 a29ab helloworld_static
因此,执行简单的helloworld程序的观察结果如下,
与动态链接的可执行文件相比,静态链接的可执行文件需要更多的空间。这是静态链接的缺点,而动态链接的优点。
共享库中只有一个副本驻留在内存中,用于动态链接的可执行文件。如果多个进程同时调用共享库的同一对象模块,则它们都将使用该库的同一副本。而对于静态链接,将库中所有使用的对象复制到每个可执行文件中。因此,每个库对象的副本驻留在每个不同进程的内存中。与动态链接的可执行文件相比,这导致静态链接的可执行文件使用更多的RAM。
动态链接具有更多的系统调用,这意味着动态链接的可执行文件将需要更多时间来运行/执行。
如果您想要更详尽的解释,可以在程序执行期间使用strace
进行实际的系统调用跟踪,可以使用visit a page I wrote about this issue on my website。