rust Winit示例窗口未在WSL 2上打开

bf1o4zei  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(130)

我的最终目标是在WSL中使用Pixels在Rust中创建数据可视化。
然而,我无法运行Pixels示例,所以我首先想确保Winit可以正常运行。从GitHub下载Winit存储库并运行window示例可以正常工作。


的数据
但是,如果我创建一个新项目并将示例代码复制粘贴到其中,那么运行代码不会再打开窗口。



运行gdb时,代码似乎卡在window.request_redraw()中,但我找不到其他的东西。
我对窗口系统不是很了解,但是通过运行echo $DISPLAYecho $WAYLAND_DISPLAY,我分别得到了:0wayland-0,我相信这表明WSL安装了X11和Wayland功能。
我正在使用Ubuntu 22.04.3 LTS。运行cat /proc/version将打印Linux version 5.15.90.1-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Jan 27 02:56:13 UTC 2023
我似乎对Cargo如何管理依赖性有一些误解,因为我不知道为什么当我指示Cargo下载相同版本的Winit源代码时,相同的代码会在Winit源代码项目中运行,而不是在我自己的项目中运行。我已经尝试了Winit v0.29,v0.28和v0.27,同样的问题仍然存在。
复制步骤:

git clone https://github.com/rust-windowing/winit.git
cd winit
cargo run --example window

字符串
Windows开得很好

cd ..
cargo new window
cd window
cargo add winit
cargo add simple_logger
cp ../winit/examples/window.rs src/main.rs
mkdir src/util
cp ../winit/examples/util/fill.rs src/util
cargo run


Windows打不开……

ybzsozfc

ybzsozfc1#

解决了!
TL;DR示例代码有一个我在自己的项目中没有启用的功能标志。
在徒劳地调试了window.rs中的主要示例代码后,我处理了fill.rs中的帮助代码。有一个函数fill_window()有两个签名:

#[cfg(all(feature = "rwh_05", not(any(target_os = "android", target_os = "ios"))))]
pub(super) fn fill_window(window: &Window) {
    ...
}
    
#[cfg(not(all(feature = "rwh_05", not(any(target_os = "android", target_os = "ios")))))]
pub(super) fn fill_window(_window: &Window) {
    // No-op on mobile platforms.
}

字符串
第一个应该在启用rwh_05功能并且target_os不是androidios时运行。否则,第二个应该运行。
我在每一个函数中都放了一个println!(),发现我的window项目正在编译第二个(无操作)函数,而源winit项目正在编译第一个函数。
因此,target_os == androidtarget_os == iosrwh_05未启用。
我通过向fill.rs添加代码运行了一些测试

#[cfg(target_os = "android")]
compile_error!("target_os = android");

#[cfg(target_os = "ios")]
compile_error!("target_os = android");

#[cfg(target_os = "linux")]
compile_error!("target_os = linux");


输出显示target_oslinux

error: target_os = linux
  --> src/util/fill.rs:16:1
   |
16 | compile_error!("target_os = linux");
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: could not compile `window` (bin "window") due to previous error


接下来,

#[cfg(feature = "rwh_05")]
compile_error!("rwh_05 feature enabled");

#[cfg(not(feature = "rwh_05"))]
compile_error!("rwh_05 feature is not enabled");


输出显示未启用rwh_05

error: rwh_05 feature is not enabled
  --> src/util/fill.rs:16:1
   |
16 | compile_error!("rwh_05 feature is not enabled");
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: could not compile `window` (bin "window") due to previous error


这就是我得到启示的地方。
我错误地将以下内容放入Cargo.toml中,以为它会 * 全局 * 启用rwh_05,但实际上它只为winit机箱启用了该功能,而不是我自己的本地项目。

[dependencies]
winit = { path = "./winit", features = ["rwh_05"] }


添加

[features]
rwh_05 = []


Cargo.toml并使用cargo run --features rwh_05运行时,窗口示例将按预期运行:
x1c 0d1x的数据

相关问题