【问题标题】:How does one deploy a VS, C++, OpenGL application to a second computer?如何将 VS、C++、OpenGL 应用程序部署到第二台计算机?
【发布时间】:2020-02-03 05:07:57
【问题描述】:

我试图简单地将 OpenGL、C++ 应用程序从一台计算机部署到另一台计算机。该应用程序是使用 Visual Studio 2017 社区编写的。第一台电脑安装了VS,第二台没有。

这些计算机分别具有 Intel Core i7-8550U CPU 和 Intel Atom x5-Z8350 CPU。两者都运行 Windows 10 家庭版。

VS 项目一开始是一个空项目,我在其中添加了所有内容。

我已将发行版、x64 应用程序 .exe 文件和项目开发所需的一个 .dll 文件复制到第二台计算机上的单个目录中。

Microsoft instructions for local deployment 说“本地部署,您从 Visual Studio 安装中复制特定的 Visual C++ DLL(通常在 \Program Files (x86)\Microsoft Visual Studio version\VC\Redist\platform\library\ 中)并安装它们位于与应用程序可执行文件相同的文件夹中的目标计算机上。您可以使用这种部署方法来支持没有管理员权限的用户安装,或者支持可以从网络共享运行的应用程序。”

我在 VS 中可以看到或找到的任何设置都无法告诉我我开发并在第一台计算机上运行的应用程序正在使用哪些 .dll 文件。有一个 VS 输出窗口,其中显示了许多 .dll 文件,但这些文件位于 c:\windows\system32 中。

根据 Microsoft 说明中有关 \Program Files (x86)\Microsoft Visual Studio version\VC\Redist\platform\library\ 中 MSVC DLL 的参考,我查看了 ..\VC\Redist\MSVC\14.16。 27012\x64 在第一台电脑上找到了这些文件夹:

我已将 .CRT 目录和 .MFC 目录中的 DLL 复制到第二台计算机,但无济于事。

当我尝试在第二台计算机上运行该应用程序时,它会显示消息“无法创建 GLFW 窗口”,这在我编写的代码中如下所示:

似乎必须有一个简单的方法来做到这一点。我看到了对旧的 Microsoft 应用程序(我认为)的引用,depends.exe,它提供了所需 DLL 的列表,但它不再与 Windows 系统一起部署。

【问题讨论】:

    标签: c++ visual-studio opengl visual-studio-2017


    【解决方案1】:

    缺少 DLL 或 RTL

    导致崩溃或什至没有错误,而只是立即关闭您的应用程序(这就是 MSVCPP RTL 正在执行或在某个时间点执行或不匹配的操作)。

    由于 RTL 库一直在变化(IIRC 一年一次),已经有很多版本在新的操作系统计算机上使用 MSVCPP 应用程序非常好运。为了使用某些应用程序,您通常需要找出它需要哪个版本的 RTL,而他们通常不会报告,因此您最终将安装所有您可以动手的应用程序...

    有一种方法可以解决这个问题,只需让您的编译器/链接器将它需要的所有内容直接链接到 exe 文件中,而不是使用 RTL DLL。但是我没有在 MSVCPP 中编码,并且从我听说 MS 从他们的环境中删除了这个选项(我使用的其他编译器仍然有它)

    您的错误消息表明您的应用程序正常运行并且没有丢失任何内容。

    问题出在 GL 方面。 Windows 10 通常会强制使用错误的驱动程序(而不仅仅是 gfx 卡)。 goto 案例正在强制执行(很可能是故意)有错误的 MS 驱动程序(其中 GL 有错误,而 DX 或多或少可以工作),而不是供应商提供的。为了解决这个问题(检查驱动程序制造商,如果不是应该的)下载并安装正确的驱动程序从您的 gfx 供应商站点不要使用 gfx 卡的 Windows 驱动程序服务!!!

    【讨论】:

    • Spektre,谢谢。您的最后一条评论,即“问题出在 GL 方面”,让我得到了答案。第二台计算机的视频驱动程序是最新的,尽管来自 Intel 而不是 Microsoft 的最新视频驱动程序的日期是 2016 年 7 月。我的应用程序运行的是 2014 年 8 月发布的 OpenGL 4.5。尽管如此,看来第二台计算机的视频驱动程序不支持该版本。作为测试,我将代码中的 OpenGL 版本降低到 3.3,应用程序现在可以在第二台计算机上运行。 ...
    • ...我将同时试验 OpenGL 版本号和 DLL(一次消除一个),看看它在哪里中断。
    • @user34299 你甚至可以调用旧的 1.0 上下文并使用glGetString 读取 GL 版本...然后打开兼容的 GL 版本或抛出相关的错误消息。在您的代码中没有看到任何 GLFW 提示,所以我没有意识到您正在执行 GL 上下文版本...
    • 我确实使用glGetString()函数查看了正在使用的OpenGL版本,发现第二台计算机最多可以容纳v4.4。所有这些努力,我使用的是 v4.5!
    • @user34299 嗯,这很可悲,但我的经验是英特尔不会更新旧 gfx 卡/APU 的驱动程序......也许你可以找到像 omega 这样的第 3 方驱动程序,或者尝试像 nVidia 的 nvemulate.exe orgive 这样的仿真提升希望并移植到旧 GL ...
    【解决方案2】:

    您可以使用 DUMPBIN /DEPENDENTS EXENAME 来获取绑定 DLL 的列表。请注意,这仅列出了带有导入表条目的 DLL,如果您正在实例化 COM 对象,这根本没有帮助。

    我的猜测是您可能缺少目标系统上的 opengl 驱动程序/dll。

    ed:实际上我将把它缩小到缺少驱动程序,因为如果你缺少 DLL,你会在加载时遇到错误。您能够调用该函数的事实意味着您已绑定到它,但是当它尝试调用驱动程序时您只会遇到失败。尝试调用一些良性的东西来查询驱动程序或设备信息,比如版本或字符串。如果失败,您就知道驱动程序丢失了。

    【讨论】:

    • 埃里克,谢谢。我不知道 DUMPBIN.EXE。它确实显示了我的 .exe 文件所需的 DLL。我确实没有必须保留我的代码所需的任何内容,以便 .exe 文件现在可以在第二台计算机上运行。也就是说,我确实发现第二台计算机安装了旧版本的 Microsoft Visual C++ Redistributable for x86 和 x64,并且在C:\Windows\System32 中找到了 DUMPBIN 指定的至少一个 DLL。微软似乎确实让这变得比需要的更难。
    猜你喜欢
    • 2018-02-02
    • 2011-09-14
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多