我已经阅读的论据双方关于是否应该链接C runtime library静态或动态,在Visual Studio项目,并且我仍然不能完全肯定在想什么。

我的项目的拉扯在一些第三方的库(蟒蛇,HDF5,Trilinos,Microsoft MPI),每个必须建立与相同的runtime library作为我的最终的可执行(否则不能将它们连接在一起)。当联静态的,这些图书馆将包含一个复制的C runtime.我读到,这是负责引起的问题,因为最终可执行将包含多个复运行时,其中没有一个可以相互作用。但是不连接的抱怨如果同样的符号是繁殖的定义?

我希望避免"DLL地狱",但我担心阴险的错误,可能产生静态链接在多个复运行时间。我读的东西错了吗?

另外,我利用Visual Studio2005年我读,Service Pack1运行时不是向后兼容。这是否意味着一个应用程序建造,而不SP1将不在计算机上运行,具有SP1dll,即使他们有同样的名字(例如msvcr80.dll)?

有帮助吗?

解决方案

联静态将膨胀所有您的前任和Dll,并可能导致崩溃(例如。如果一DLL呼吁free()指分配malloc()在不同的DLL)。

你可以得到的最好的两个世界相联系的动态和部署的运行时Dll作为私人集会。这只是意味着把一个复制的特别命名目录中包含的运行时Dll和他们的表现你可执行的。

看到"部分部署的视觉C++库Dll作为私人集会"在 http://msdn.microsoft.com/en-us/library/ms235291(VS。80).aspx 对于细节,但基本上您应用程序看起来像这样:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

作为你的最后一个问题,是的,目标计算机需要的正确版本的运行时Dll工作,但通过部署他们的私人集会,你的保证。

另一个好处是,非管理员用户可以安装应用程序(不到的程序的文件,但在其他地方)-他们不需要许可写的文件进入;区域。

其他提示

唯一的时候你会得到多份运行时间是当你静态链接图书馆成DLL-每个DLL会得到一个副本,以此将该exe。如果他们 所有 静态图书馆和不Dll,他们将所有链接在一起的和所有你的图书馆将分享相同的运行时间。

这是连接的工作。

...做的很静...尝试修复DLL地狱还没有制定出来,很好...只是添加一个额外的达到200给你安装的静态联系。

静态图书馆不需要是静态链接到其他的静态图书馆。你只需要连接所有静态的图书馆在你的主要项目。这种方式编译器不会抱怨多个符号。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top