我使用Visual C ++ 2015和OpenGL制作了一些游戏。当我在计算机上运行它时没有问题,但是当我在其他计算机上运行它时,它表明缺少某些DLL。我想知道如何确保下次不会发生这种情况,我应该考虑些什么,以便避免文件丢失的问题?
我使用Visual C ++ 2015和OpenGL制作了一些游戏。当我在计算机上运行它时没有问题,但是当我在其他计算机上运行它时,它表明缺少某些DLL。我想知道如何确保下次不会发生这种情况,我应该考虑些什么,以便避免文件丢失的问题?
Answers:
您需要在要运行可执行文件的任何计算机上安装Visual Studio版本的可再发行文件,例如VS2015的https://www.microsoft.com/zh-cn/download/details.aspx?id=48145。您可能还需要RedX用于DirectX或其他组件。
应用程序的安装程序通常会为所有依赖项安装所有可再发行文件。您可以使用InnoSetup,NSIS,WIX或其他各种工具来制作这样的安装程序。
可以使不需要任何可再发行的可执行文件成为可能,但是您只能使用Windows核心功能的子集,这通常不足以制作任何有意义的游戏或大型应用程序。安装程序本身就是不需要任何依赖项即可运行的应用程序的示例。
MSVCRT.DLL
(包含在Windows本身中)而不是MSVCPxxx.DLL
(Visual Studio发行版中包含的特定于版本的版本)即可。
我使用Dependency Walker来跟踪丢失的DLL:
Dependency Walker对解决与加载和执行模块有关的系统错误也非常有用。Dependency Walker检测到许多常见的应用程序问题,例如缺少模块,无效模块,导入/导出不匹配,循环依赖项错误,模块的机器类型不匹配以及模块初始化失败。
VS中还有一个编译时选项可以静态链接 DLL:
对于Visual C ++,您可以选择几种方式来处理重新分发:从安装程序运行EXE(具有管理员权限),将MSM合并模块与MSI安装程序一起使用,甚至并排DLL。看到详细信息, MSDN。
更大的问题是OpenGL。Windows随附的唯一OpenGL版本是OpenGL 1.5软件渲染器。其他任何情况都需要安装第三方ICD。
这是许多Windows游戏使用DirectX的原因之一,因为它包含在操作系统中。请参阅面向游戏开发人员的Direct3D 11部署,而不是直接安装。
免责声明:这是一种解决方法,不是您的答案的解决方案,但仍然是非常可行的可能性。
如果您要绝对确定VS本身不存在依赖关系-但它有其自身的缺点-在代码生成设置中,您可以选择使用多线程(MT)/多线程调试(MD)(用于调试版本) ),而不是MT DLL(MTd)/ MT调试DLL(MDd)。
有什么缺点?
优点是什么?
检查此链接以获得更详尽的解释以及使用静态运行时可能遇到的陷阱。
另一个解决方法是将所有必需的DLL放在您的二进制文件所在的位置。您的应用程序不会从更新(运行时库)中受益,仅此而已。
真正的解决方案是以发布/非调试dll模式(MTd)分发应用程序,并提供正确的VC ++可再发行安装程序(以及您可能使用的任何其他库安装程序,例如OpenAL,DirectX9,PhysX),然后让用户运行在运行您的应用程序之前(如其他答案所指出)。
还要确保让用户知道他/她可能需要更新他/她的GPU驱动程序(因为这些驱动程序也包含许多应用程序的多个运行时,例如OpenGL,Vulcan)。