【问题标题】:C++ DLL backward compatibility with NO CLRC++ DLL 向后兼容 NO CLR
【发布时间】:2014-08-05 06:21:46
【问题描述】:

我已经查看了 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 上运行良好。但是当我将相同的输出 DLL 放在窗口 7 中时,我得到类似“缺少 DLL MSVCR120.DLL”的错误,我尝试将丢失的 DLL 复制到 Windows 7 中的 System32 文件夹中,并且 DLL 丢失错误发生离开,但我的 DLL 仍然无法工作。只有当我在 Windows 7 上的 Visual Studio 2010 中构建源代码然后使用其输出 DLL 时它才能正常工作。在 Windows 7 上,安装了 C++ 可再发行运行时 2010。我也尝试安装其他版本的 C++ 运行时,但在 Win 7 上没有成功。

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

PS:该项目是一个 Windows Credential Provider 实现。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      事情没有按预期工作可能有几个原因

      1. 您的项目目标可能是 Windows 8,请参阅 - Using the Windows Headers。基本上,如果 dll 是为 Windows 8 编译的,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,反之亦然。

      我没有足够的声誉来发布两个以上的链接,所以请搜索 Dependency Walker

      【讨论】:

      • 如何更改项目目标窗口?一个主要问题是在 VS2013 中构建的源代码未在 VS2010 中成功构建,并且在编译时出现错误“错误 4 错误 C2784: 'std::_Array_const_iterator<_ty> std::operator +(_Array_const_iterator<_ty>::difference_type,std::_Array_const_iterator<_ty>)' : 无法从 'const char [2]' 推导出 'std::_Array_const_iterator<_ty>' 的模板参数”
      • @user2918703 我没有足够的信息来帮助解决这个问题,可能是您使用了 C++11 功能。在 VS2013 上编译 DLL 和应用程序怎么样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多