我在 WSL Ubuntu 上使用 g++。我使用 git 克隆了 GLFW 存储库,使用 ccmake
命令配置和生成二进制文件,然后在“build”目录中使用 make
最终创建了 。一个
文件。我将所有与 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.0
和export DISPLAY=1
和export 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/