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(推测可能在不同的目录中或具有不同的名称)。 只是微软进行严重开发的另一个例子,更难 比必要的困难。
Vendor.lib需要是静态编译的库。如果当你链接这个你仍然需要Vendor.dll,听起来像Vendor.lib实际上是一个导入库,而不是一个静态库。
检查供应商是否提供了另一个Vendor.lib(应该比当前的.lib大一点),这是一个静态库并尝试链接到该库。如果是这样,你将不需要该DLL。
这不是MS特定的。 Linux也有导入库。 – rubenvb 2012-03-05 14:18:46
Unix有两种类型的“库”:库(.a文件)和共享对象(.so文件)。提供库(一般意义上)的供应商通常会提供这两种库。如果您使用.a文件进行链接,则可以静态链接,如果使用.so链接,则可以动态链接。与Microsoft解决方案的问题是1)您有两个不同的文件用于动态链接,并且2)其中一个文件具有与静态库相同的名称。 – 2012-03-05 14:21:10
谢谢你的回答。也许我不是唯一一个对这个话题感到困惑的人。所以,正如你所说,有两种.lib文件,一种是在需要动态库时创建的,另一种可以是静态库。我没有找到另一个Vendor.lib文件,所以我想我是第一个案例...谢谢! – linello 2012-03-05 14:34:28