C ++ DLL向后兼容NO CLR

时间:2014-08-05 06:21:47

标签: c++ dll visual-studio-2013 windows-authentication

我已经看过SF的这两个链接,但他们没有帮助我:

https://stackoverflow.com/questions/21591649/c-dll-providing-backward-and-forward-compatibility-for-callers

.lib and .dll Backward Compatibility

我有一个C ++项目,它不是基于CLR。输出是一个DLL文件。现在我在Windows 8上并使用Visual Studio 2013来构建项目。输出DLL在Windows 8上工作正常。但是当我在窗口7中输入相同的输出DLL然后我得到错误,如“Missing DLL MSVCR120.DLL”我试图将丢失的DLL复制到Windows 7中的System32文件夹中,DLL丢失错误消息离开,但我的DLL仍然无法正常工作。只有当我在Windows 7上的Visual Studio 2010中构建源代码然后使用其输出DLL时才能正常工作。在Windows 7上,安装了C ++可再发行的运行时2010。我还尝试安装其他版本的C ++运行时但在Win 7上没有成功。

我是否可以不仅使用一台开发机器和一台视觉工作室来创建一个(甚至多个)C ++ DLL,它可以在大多数Windows版本中运行,如Vista,7,8,Server 2008等?现在我必须使用自己的VS在每个不同的操作系统上构建源代码。

PS:该项目是Windows凭据提供程序实现。

2 个答案:

答案 0 :(得分:0)

可能有一些原因导致事情无法按预期发挥作用

  1. 您的项目目标可能是Windows 8,请参阅 - Using the Windows Headers。基本上,如果为Windows 8编译了dll,Windows 8的某些新功能将被解锁,但这意味着不支持以前版本的Windows。
  2. C ++ Dlls在编译器之间不兼容ABI,因此根据DLL的实现方式以及编译器的不同之处,它可能会也可能不会起作用。我的意思是当使用DLL的应用程序在VC 2010中编译并且DLL在VC2013中编译时,VS2010应用程序可能无法加载VC2010 dll。请参阅HowTo: Export C++ classes from a DLL或者您可以执行完整的COM dll。
  3. 你的Dll依赖于其他一些不存在的DLL,或者没有正确的版本(即你使用的dll中添加了一个新函数,但是dll的版本是系统不包含该功能)。在您遇到问题的计算机上使用Dependency Walker打开DLL,以显示缺少的DLL。
  4. 与第3点相关。在没有加载DLL的系统上安装vcredist 2013,如果DLL是64位,则需要64位vcredist,或者如果dll是32位,则需要32位vcredist。
  5. 64位应用程序无法加载32位dll,反之亦然。
  6. 我没有足够的声誉来发布两个以上的链接,所以搜索Dependency Walker

答案 1 :(得分:0)

您通常需要在使用DLL的所有计算机上安装VS2013 redistributable

另一种方法是构建项目以与静态运行时库链接,但生成的可执行文件的大小会更大; this SO answer中的更多详细信息。

相关问题