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

lin*_*llo 8 c++ deployment visual-studio-2010 static-linking visual-c++

我在Visual Studio 2010中有一个非托管的C++项目.它使用boost,glut和供应商提供的另一个库.

我已经设置了项目来创建更多"dll-indepenendent"可执行文件.所有的boost库都是静态链接的,并且在可执行文件所在的目录中不需要dll.

对于Glut来说,我已经链接了静态glut32.lib而不是glut32.dll,并且没有问题.

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

现在,我之前说过的供应商提供了两个供应商:Vendor.lib和Vendor.dll.

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

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

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

我知道有很多关于这个论点的问题和页面,但这些都没有澄清我的观点.

有些想法?

Jam*_*nze 10

微软处理它的方式有点滑稽:当你创建一个.dll时,你也创建一个.lib,它包含.dll中的公共符号.您必须链接.lib才能在运行时加载.dll,但是.lib仍然不是静态库.如果您的供应商提供静态链接的版本,则将没有.dll或两个.lib(可能在不同的目录中或具有不同的名称).只是另一个微软认真开发的例子比必要的更困难.

  • Unix有两种类型的"库":库(.a文件)和共享对象(.so文件).提供库(通常意义上的)的供应商通常会提供两者.如果链接到.a文件,则静态链接,如果链接到.so,则动态链接.Microsoft解决方案的问题在于:1)您有两个不同的文件用于动态链接,以及2)其中一个文件与静态库具有相同的名称. (8认同)
  • 这不是MS特定的.Linux也有导入库. (2认同)

Fra*_*ser 7

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

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