c++ - 即使在手动设置显示环境变量后,WSL Ubuntu 仍显示 "Error: Unable to open display"

标签 c++ opengl ubuntu-18.04 windows-subsystem-for-linux glfw

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

enter image description here

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,没有其中工作。关于如何解决这个问题的任何想法?

最佳答案

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

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

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

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

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

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

关于c++ - 即使在手动设置显示环境变量后,WSL Ubuntu 仍显示 "Error: Unable to open display",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70546571/

相关文章:

opengl - glShaderSource的参数是什么意思?

c++ - openGL 3.1 是否支持实例化?

sudo - 如何修复/etc/sudoers : syntax error near line number

node.js - 如何升级npm版本到最新? Ubuntu显示安装成功但不升级版本

C++ 无法用 {...} 初始化

c++ - C 到 C++ 转换器

c++ - 如何获取流程描述?

c++ - vector 迭代器不兼容

opengl - gl_ClipVertex 相对于 gl_ClipDistance 如何工作?

python - Ubuntu 18.04 上的 JModelica