当前位置:C++技术网 > 资讯 > 静态链接和共享链接的分析

静态链接和共享链接的分析

更新时间:2015-06-23 23:27:38浏览次数:1+次

    有时候,我们在网上下载一个项目代码,在本机运行时提示,MFCxxx.dll不存在。或者有时候,我们把做好的程序发给好朋友,结果好朋友电脑运行时也这样提示。那怎么办呢?
    先让我们来了解一下基本原理,然后就很好的理解对策。
    静态链接,就是在程序生成时,将程序所需的一些动态库文件在链接生成EXE文件时直接打包到EXE文件里,这样,需要多少库文件支持就需要将多少库文件打包到EXE文件中。这样在EXE可执行文件(程序)运行时,程序直接到EXE文件内部提取相关的函数执行,这样就不用依赖外部提供的库文件了。因为要将库文件打包到EXE文件中,那么可想而知,这些库文件必然会增加EXE文件的大小。如果库文件很大,那么再静态链接和打包后,会使EXE文件急剧增大,可能就达到几M或者十几M甚至几十M。有时候并不是我们希望的,我们不希望程序变得很大。对于一般的小程序小工具,都是作为单独的EXE文件,这样传播时方便,也不会因为少了库文件导致无法运行,只是文件大了点。所以说,这种方式就很适合。
    共享链接,就是在程序生成时,并不会将库文件打包到EXE文件中的形式。如果要调用库文件中的函数,那么会引导程序去系统查找相关的库文件。查找的路径包括系统的文件夹以及当前文件夹和环境变量中的路径。如果是系统的库,自然就会到系统文件夹去找,如果是我们自己的库文件,我们一般放在我们的文件夹即当前文件夹里,这是通常的做法。或者在环境路径里指定路径,然后放在一个单独的文件夹。如果程序运行时,这些文件夹里都没有所需要的库文件,那么程序就会报错,说找不到xxx.dll文件而无法运行。
    我们为什么要共享链接形式呢?当然是有好处的,简要说一下。首先,因为不需要把库文件打包到EXE文件中,因此,EXE文件自然就很小。其次,因为使用了很多系统库,如果运行程序的计算机有这些库,即可直接运行,我们的程序根本就不用提供这些库。但是我们自己做的库,其他计算机是没有的,那么我们需要提供。这样一方面也可以减少总体程序的大小。再次,因为是共享库文件,如果一个软件有好多子程序,这些子程序都需要使用自己的库文件或者系统的库文件,那么就可以共用这些库文件,而不必每个EXE子程序都带一个,从而减少了数据冗余,也是程序大小减小。最后,因为程序所需的库文件是共享的,那么我们升级程序,只需要将这个库文件替换即可,而不用改动EXE,这也就是升级变得方便。
    当然,各有各的好处,也各有各的坏处。共享形式最容易出现的问题就是缺少库文件。静态的就只是程序变大了而已。如果为了省事而对程序大小没有要求,直接使用静态链接生成小程序就很好。但是如果是大程序,有很多组件模块的,最好使用共享方式。具体采取哪一种,看具体情况,灵活使用。
    那么了解了基本知识后,我们再看看以上提到的问题。如果是在运行程序时提示缺少文件,那么我们可以将dll文件在网上下载,然后复制到C:\Windows\System32目录下,当然程序所在的目录下也是可以的。C盘是系统盘,如果你系统在D盘,那就改成D:\Windows\System32。把dll文件放在这个目录下,再运行程序,程序可能还提示缺少其他的dll文件,那我们就把所需的其他dll全部下载放到这个目录,最后就可以正常运行了。当然,这是在使用时做的。如果你是开发者,你当然不希望这种事情发生,给使用者带来很不好的影响。 
    作为开发者,你可以采取下面的方法解决。
    1.在编译链接时,选择静态链接。这种方法很简单。可以在项目创建向导中选择,也可以在项目属性中选择,选择之后重新编译链接即可。
    2.在程序发行时,将所需的库文件都提取出来,然后都与程序一起发布。可以直接放在程序一个文件夹下即可。或者提供安装程序,将系统库文件复制到系统目录下。
    在实际的开发中,我们要注意,debug版本和release版本的项目属性是分开设置的,有的项目在debug是静态链接在release是共享链接,下载到这些项目后,会发现,调试方式下的程序可以直接运行,而release的提示缺少文件。因为你的计算机没有这些库文件。这时候你设置一下。只要你安装了开发软件,软件是自带了库文件的,静态方式就可以将这些库文件链接进来,从而不需要你的系统目录有这些库文件。
    以上就是静态链接和动态链接的简单分析,如果有问题,请提出你的疑问,我们尽量解答。