Visual Studio 2010中的动态和静态链接和部署

Dynamic and static linking and deployment in Visual Studio 2010

本文关键字:静态 链接 部署 动态 Studio 2010 Visual      更新时间:2023-10-16

我在Visual Studio 2010中有一个非托管C++项目。它使用boost、供过于求和供应商提供的另一个库。

我已经设置了这个项目来创建一个更"dll independent"的可执行文件。所有的boost库都是静态链接的,在可执行文件所在的目录中不需要dll。

对于Glut也是如此,我已经链接了静态的glut32.lib而不是glut32.dll,同样没有问题。

我为运行库选择了NON dll版本,即多线程调试(用于调试配置)和多线程发布配置。

现在,我之前谈到的供应商提供了两种替代方案,一种是vendor.lib,另一种是vendor.dll。

Vendor.lib添加在Linker->Additional dependencies中,但在运行时,我总是必须将Vendor.dll放在可执行文件的同一目录中,否则运行时环境会抱怨,因为它找不到Vendor.dll库。

我应该如何解决这个问题?我想避免把.dll文件放在每个目录中。

我不想把dll放在exe的同一目录中,通常在Visual Studio中部署非托管c++控制台应用程序的指导原则是什么?

我知道关于这个论点有很多问题和篇幅,但没有一个能澄清我的这一点。

有什么想法吗?

Microsoft处理此问题的方式有点有趣:当您创建.dll中的公共符号.dll。必须链接到.lib才能在运行时,但是这个.lib仍然不是一个静态库。如果您的供应商提供了静态链接的版本,将没有.dll,或者两个.lib(可能在不同的目录中或使用不同的名称)。这只是微软进一步认真发展的又一个例子比必要的更困难。

Vendor.lib需要是一个静态编译的库。如果链接时仍然需要Vendor.dll,听起来Vendor.lib实际上是一个导入库,而不是静态库。

检查供应商是否提供了另一个vendor.lib(应该比您当前的.lib大一点),这是一个静态库,并尝试链接到它。如果是这样,则不需要dll。