静态链接和动态链接之间的区别

时间:2010-11-11 11:12:53

标签: dll

静态链接和动态链接有什么区别?

5 个答案:

答案 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