从Windows二进制文件中删除msvcp90d.dll依赖
Removing msvcp90d.dll dependancy from Windows binary
我有一个不能在某些windows操作系统上运行的dll。使用依赖walker,我发现这些系统上缺少msvcp90 .dll。我不想要任何需要c++可重发行的运行时依赖,并且由于调用DLL的应用程序不是用c++编写的,因此它对c++可重发行版没有任何依赖。
我猜我在编译dll时在链接器首选项中留下了DEBUG选项,这就是为什么它需要msvcp90d.dll?
补充道:对不起,我在原来的问题....中粘贴了错误的dll名称长时间坐在显示器前……
这个dll是一个第三方的dll,不是我写的,是我在VS2008中编译的。
MSVCP90与调试无关(即msvcp90d)。您可以通过将编译器切换到/MT(而不是/MD)来删除依赖项。您还需要确保您链接到的每个静态库也经过编译/MT。
我不建议构建app/MT,因为它对系统性能有显著的负面影响,并且在CRT出现安全问题时使维护时间更长。
最后,请注意/MT意味着您的CRT是私有的。所以你必须确保CRT/STL类型不会越过你的DLL边界。
Martyn
我看到的你的选项:
- 编译带有/MT选项的DLL,以使用到C运行时的静态链接。
- 继续动态链接到运行时,但是把C运行时和你的应用一起分发。
需要MSVCP90.dll,因为dll很可能是用Visual Studio 2008编译的。这就是发布运行时。简短的回答是,如果你不想要c++运行时依赖,就不要使用c++库或应用程序。
然而,你可以做以下任何一件事来解决你的问题:
- 将可重发行版安装到目标系统以满足依赖
- 从应用程序中删除对该dll的依赖
- 根据目标系统中已有的VC版本重新编译dll
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 程序无法启动,因为您的计算机中缺少MSVCP90D.dll
- 从Windows二进制文件中删除msvcp90d.dll依赖