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

问题描述:

我在Visual Studio 2010中有一个非托管的C++项目。它使用boost,glut和来自供应商的另一个库。Visual Studio 2010中的动态和静态链接和部署

我已经建立了项目来创建一个更“dll-indepenendent”的可执行文件。所有boost库都是静态链接的,并且在可执行文件所在的目录中不需要dll。

同样的事情为Glut,我已经链接静态glut32.lib而不是glut32.dll,并再次没有问题。

我已经为运行时库选择了NON-dll版本,即Multithreaded Debug(用于调试配置)和Multithreaded for Release配置。

现在,我以前说过的供应商提供了两个替代品Vendor.lib和Vendor.dll。

Vendor.lib被添加到链接器 - >其他依赖项中,但是在运行时我总是必须将Vendor.dll放在可执行文件的同一目录中,否则运行时环境会抱怨,因为它没有找到Vendor .dll库。

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

我不想把dll放在exe文件的同一目录中,一般来说,在Visual Studio中部署非托管C++控制台应用程序的准则是什么?

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

有些想法?

微软在处理它的方式上有点有趣:当您创建 .dll时,还会创建一个.lib,其中包含 .dll中的公共符号。您必须链接到.lib才能加载运行时的 .dll,但该.lib仍不是静态库。如果您的供应商 提供静态链接的版本,则不会有.dll或 两个.lib(推测可能在不同的目录中或具有不同的名称)。 只是微软进行严重开发的另一个例子,更难 比必要的困难。

+2

这不是MS特定的。 Linux也有导入库。 – rubenvb 2012-03-05 14:18:46

+8

Unix有两种类型的“库”:库(.a文件)和共享对象(.so文件)。提供库(一般意义上)的供应商通常会提供这两种库。如果您使用.a文件进行链接,则可以静态链接,如果使用.so链接,则可以动态链接。与Microsoft解决方案的问题是1)您有两个不同的文件用于动态链接,并且2)其中一个文件具有与静态库相同的名称。 – 2012-03-05 14:21:10

+0

谢谢你的回答。也许我不是唯一一个对这个话题感到困惑的人。所以,正如你所说,有两种.lib文件,一种是在需要动态库时创建的,另一种可以是静态库。我没有找到另一个Vendor.lib文件,所以我想我是第一个案例...谢谢! – linello 2012-03-05 14:34:28

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

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

+0

不幸的是,我没有在该库中的其他.lib文件,所以我想我在动态链接的情况下。 没有其他方法可以包含.dll而不是将其复制到可执行目录中(或将它们复制到System32文件夹中?) – linello 2012-03-05 14:35:54

+0

如果您有权访问供应商源,则可以将vendor.lib自己编译为静态库。否则,如果你必须使用共享库,那么你的exe需要在运行时访问它,这意味着使用exe将它添加到文件夹中,或者将它放在包含在%PATH%中的文件夹中(约定是System32文件夹)。 – Fraser 2012-03-05 14:49:49