即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

Rap*_*ers 2 c++ opengl glfw windows-subsystem-for-linux ubuntu-18.04

我在 WSL Ubuntu 上使用 g++。我使用 git 克隆了 GLFW 存储库,使用ccmake命令来配置和生成二进制文件,然后make在“build”目录中使用以最终创建文件.a。我安装了所有与 OpenGL 相关的库/usr/ld(我不记得到底安装了哪些库,因为我必须安装这么多。无论如何,g++ 命令有效,所以我认为它是成功的)。后来我在VS Code上做了一个项目,如下所示:

在此输入图像描述

GLFW 包含文件夹来自上述克隆的存储库,GLAD 和 KHR 包含文件夹来自glad.dav1d.de,我将 GL 版本(在 API 下)设置为3.3,将 Profile 设置为Core

在 中main.cpp,我放置了一段用于初始化 GLFW 的简单代码片段:

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

int main()
{
    // Initialize GLFW
    if (!glfwInit()) {
        std::cerr << "Failed to initialize GLFW" << std::endl;
        return 1;
    }
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    std::cout << "Success" << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后使用这个命令来编译项目:g++ -Wall -I./include/ -L./lib/ src/*.{c,cpp} -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -ldl -o main。没有任何警告或错误或任何东西。运行可执行文件后,我收到 GLFW 无法初始化的错误消息。我有点困惑为什么会发生这种情况,所以我输入命令glxinfo发现我的DISPLAY环境变量还没有设置。

我完全不知道这个变量是什么,或者它代表什么。在网上搜索后,我发现了export DISPLAY=:0.0和,export DISPLAY=1export DISPLAY=IP:0.0都不起作用。关于如何解决这个问题有什么想法吗?

Not*_*1ds 6

Windows 10 上的 WSL 不支持 GUI 应用程序。当然,您可以使用 OpenGL/X 库构建应用程序,但运行它需要一个 X 服务器来实际显示它。

一般来说,您有 3 个选择。我相信所有这些都可以与 OpenGL 一起使用,尽管我还没有以这种能力测试它们中的每一个:

  • “支持”的方法是将 Windows 11 与 WSLg 结合使用。Windows 11 使用受支持的 WDDMv3.0 驱动程序(适用于 AMD、Intel 和 nVidia GPU)在 WSL2 中开箱即用地支持硬件加速 OpenGL。请参阅Microsoft 文档以获取更多信息。

  • 在 Windows 10 的 WSL 上运行 X 服务器的“正常”方法是安装第三方 X 服务器,例如 VcXsrv。请参阅此超级用户问题,了解有关该场景下 OpenGL 支持的一些详细信息。然而,我不相信这将是硬件加速的。

    在这种情况下,您需要手动配置DISPLAY变量以指向您的 Windows 主机。您会发现一些相当复杂的指示,但恕我直言,最简单的方法是通过mDNS

  • 在升级到 Windows 11 之前,当我需要 X 支持时,我使用 xrdp。这允许使用远程桌面协议和支持的应用程序(例如内置 Windows 远程桌面连接)访问 WSL 实例。我也不相信有办法使用 RDP 来硬件加速 OpenGL。在我看来,这比设置第 3 方 X 服务器要容易得多。请参阅我在询问 Ubuntu以了解启用步骤的答案。