【问题标题】:Difference between static linking and dynamic linking静态链接和动态链接的区别
【发布时间】:2011-05-08 09:58:36
【问题描述】:

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

【问题讨论】:

  • @Andrey:这不是完全重复的。实际上存在三种可能性:静态链接、加载时动态链接和运行时动态链接。另一个问题是问第二个和第三个之间的区别,而这是在谈论第一个和第二个和第三个加在一起的一组之间的区别。

标签: dll


【解决方案1】:

在静态链接中,在外部库文件中定义的函数和变量会链接到您的可执行文件中。这意味着代码在编译/链接时实际上与您的代码相关联。

通过动态链接,您在软件中使用的外部函数不会链接到您的可执行文件。相反,它们驻留在仅由您的软件引用的外部库文件中。即:编译器/链接器指示软件在哪里找到使用的函数。

在 Windows 平台上,您甚至可以在运行时显式加载 DLL 文件并连接 DLL 中包含的函数。

【讨论】:

【解决方案2】:

静态链接是在“编译时”由称为链接器的工具完成的。动态链接是在运行时由操作系统完成的。

【解决方案3】:

静态链接会增加程序的文件大小,如果系统上正在运行其他应用程序,它可能会增加内存中的代码大小... 另一方面,动态链接程序占用的空间和虚拟内存更少

【讨论】:

    【解决方案4】:

    在编译时链接的静态链接库中,但是当你这个静态链接时代码量更大,当你只有一个或两个程序时,你使用静态链接

    在运行时(或)执行时链接的动态链接库中,但代码量较小,当您有更多程序时,请使用动态链接。

    【讨论】:

    • execution timerun time有什么区别?
    【解决方案5】:

    如果我们用静态和动态链接编译简单的 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

    【讨论】:

    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    相关资源
    最近更新 更多