2011-07-18 47 views
1

我有一个我分发的dll,它不会在某些Windows操作系统上运行。使用依赖walker我发现这些系统上缺少msvcp90d.dll。 I 不要想要任何需要C++可再发行的运行时依赖,并且因为调用DLL的应用程序不是用C++编写的,所以它对C++可再发行组件没有任何依赖关系。从Windows二进制文件中删除msvcp90d.dll依赖项

我猜我离开了DEBUG选项的链接器首选项当我编译的dll这就是为什么它需要msvcp90d.dll?

新增: Appologies,我在监视器前在我原来的问题粘贴错误的DLL名称....太多时间......

该DLL是一个第三方的DLL,我没有写我在VS2008编译。

+0

msvcp90d?看起来像你离开调试,以及使用动态链接。我希望你正在使用msbuild脚本以可重复的方式构建这个DLL?我希望你不是从IDE构建的! –

回答

3

MSVCP90与调试无关(即将msvcp90 d)。您可以通过将编译器切换到/ MT(而不是/ MD)来删除依赖项。你还需要确保你链接到的每个静态库也被编译/ MT。

我建议不要构建应用程序/ MT,因为它会对系统性能产生显着的负面影响,并在CRT出现安全问题时使服务时间延长。

最后,请注意/ MT意味着您的CRT是私人的。所以你必须确保CRT/STL类型不会通过你的DLL边界。

马丁

+1

“对系统性能有显着的负面影响”请您详细说明一下吗? –

+0

Appologies,我在我原来的问题中粘贴了错误的dll名称 –

+0

@David - 如果每个人都加载msvcp90(通常是winsxs),操作系统将只为每个进程花费一组页面。如果你是静态链接,那么相同的代码会被加载很多次,浪费大量页面。每个额外的静态链接人员的总体影响是显着的。 –

1

它需要MSVCP90.dll,因为dll最可能是用Visual Studio 2008编译的。这是发行版运行时。简短的回答是,如果您不希望C++运行时依赖关系不使用C++库或应用程序。

但是你可以做以下任何的解决你的问题:

  1. 安装可再发行到目标系统,以满足依赖
  2. 从您的应用程序
  3. 重新编译卸下该DLL的依赖该DLL反对你更喜欢已经存在于目标系统上的VC版本
+0

Appologies,我在我原来的问题中粘贴了错误的dll名称 –

+0

啊然后简单地编译发布中的DLL可能就足够了,或者像其他人所建议的那样去静态路由。大多数Windows系统已经有发行版运行时可再发行版。 – AJG85

2

你的选项,我看到他们:

  1. 编译DLL与使用静态链接到C运行时/ MT选项。
  2. 继续动态链接到运行时,但将C运行时与您的应用程序一起分发。
+0

用于静态链接的+1我将该选项留出,因为我很少需要/ MT – AJG85

+2

@ AJG85附带的膨胀或其他问题我喜欢静态链接。我讨厌重新分配运行时间。正如我们所说的那样,课程中的马。 –

+0

我也喜欢静态链接。 Appologies,我在我的原始问题中粘贴了错误的dll名称 –