WSL Ubuntu showing "Error: Unable to open display" even after manually setting display environment variable

WSL Ubuntu showing "Error: Unable to open display" even after manually setting display environment variable

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

GLFW 包含文件夹来自上述克隆的 repo,GLAD 和 KHR 包含文件夹来自 glad.dav1d.de,我将 GL 版本(在 API 下)设置为 3.3,以及 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;
}

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

我完全不知道这个变量是什么,也不知道它代表什么。在互联网上搜索后,我遇到了 export DISPLAY=:0.0export DISPLAY=1export DISPLAY=IP:0.0,其中 none 有效。关于如何解决这个问题的任何想法?

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

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

  • “支持”的方法是使用 Windows 11 和 WSLg。 Windows 11 使用受支持的 WDDMv3.0 驱动程序(可用于 AMD、Intel 和 nVidia GPU)支持开箱即用的 WSL2 中的硬件加速 OpenGL。有关详细信息,请参阅 Microsoft Docs

  • 运行WSL上的X服务器Windows10的“正常”方法是安装第三方X服务器,例如VcXsrv。有关该场景下 OpenGL 支持的一些详细信息,请参阅 this Super User question。但是,我认为这不会是硬件加速的。

    在这种情况下,您需要手动配置 DISPLAY 变量以指向您的 Windows 主机。你会发现一些相当 complicated directions for doing so, but IMHO the easiest way is via mDNS.

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

WSL 2 现在支持 Windows11 上的 GUI 应用程序: https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps

我刚刚安装了 GPU 驱动程序,更新了 WSL,现在它对我有用了。