CentOS 下 Rust 图形界面开发实战指南
一 环境准备
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh,然后执行 source $HOME/.cargo/env。sudo yum groupinstall "Development Tools" -y && sudo yum install gtk3-devel glib2-devel -ysudo dnf groupinstall "Development Tools" -y && sudo dnf install gtk3-devel glib2-devel -ypkg-config --modversion gtk+-3.0(应输出版本号,如 3.24.x)。二 框架选择与快速上手 下表给出在 CentOS 上常用、社区活跃的 GUI 方案与适用场景,便于快速选型:
| 框架 | 依赖与打包 | 学习曲线 | 适用场景 | 快速上手要点 |
|---|---|---|---|---|
| GTK-rs | 依赖系统 GTK 3/4 | 中 | 传统桌面应用、Linux 原生外观 | 安装 GTK 开发库后,Cargo 引入 gtk crate 即可 |
| Iced | 纯 Rust,多后端(如 wgpu) | 中 | 跨平台桌面应用、数据可视化 | Elm 架构(State/Message/Update/View),组件生态逐步完善 |
| egui | 纯 Rust,即时模式,常见后端 wgpu/OpenGL | 低 | 工具类应用、游戏内 UI、原型 | 使用 eframe 一键运行,WebAssembly 支持良好 |
| Slint | 自带渲染器,声明式 UI | 中 | 嵌入式与桌面 | 声明式语法,性能与体积表现优秀 |
| Tauri | 前端 HTML/CSS/JS + Rust 后端 | 低-中 | 团队熟悉 Web 技术、企业内管工具 | 体积小、原生 API 集成方便,打包发布简单 |
以上框架在 Linux 上均可使用;其中 GTK-rs 与系统 GTK 深度集成,Iced/egui/Slint 为纯 Rust 路线,Tauri 适合 Web 前端团队快速落地。
示例一 GTK-rs 最小窗口(使用 GTK 3)
cargo new gtk-hello && cd gtk-hello[dependencies]
gtk = { version = "0.16", features = ["v3_24"] }
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button, Label, Box as GtkBox, Orientation};
fn main() {
let app = Application::builder()
.application_id("com.example.gtk_hello")
.build();
app.connect_activate(|app| {
let window = ApplicationWindow::builder()
.application(app)
.title("GTK Hello")
.default_width(400)
.default_height(300)
.build();
let label = Label::new(Some("Hello, Rust GUI!"));
let button = Button::with_label("Click Me");
button.connect_clicked(|_| {
println!("Button clicked!");
});
let vbox = GtkBox::new(Orientation::Vertical, 10);
vbox.append(&label);
vbox.append(&button);
window.set_child(Some(&vbox));
window.show();
});
app.run();
}
cargo run(首次可能较慢,会构建依赖)。示例二 Iced 计数器(跨平台)
cargo new iced-counter && cd iced-counter[dependencies]
iced = "0.12"
use iced::{button, Button, Column, Element, Sandbox, Settings, Text};
fn main() -> iced::Result {
Counter::run(Settings::default())
}
struct Counter {
value: i32,
inc_btn: button::State,
dec_btn: button::State,
}
#[derive(Debug, Clone, Copy)]
enum Message {
Increment,
Decrement,
}
impl Sandbox for Counter {
type Message = Message;
fn new() -> Self {
Self {
value: 0,
inc_btn: button::State::new(),
dec_btn: button::State::new(),
}
}
fn title(&self) -> String {
String::from("Iced Counter")
}
fn update(&mut self, message: Message) {
match message {
Message::Increment => self.value += 1,
Message::Decrement => self.value -= 1,
}
}
fn view(&mut self) -> Element<Message> {
Column::new()
.spacing(20)
.padding(20)
.push(
Button::new(&mut self.inc_btn, Text::new("+"))
.on_press(Message::Increment),
)
.push(Text::new(self.value.to_string()).size(32))
.push(
Button::new(&mut self.dec_btn, Text::new("-"))
.on_press(Message::Decrement),
)
.into()
}
}
cargo run。三 打包与发布
webkit2gtk3 包),然后执行 cargo tauri build 生成 AppImage 或安装包;前端资源将随应用一起打包,体积较小、分发友好。四 常见问题与排错
pkg-config --modversion gtk+-3.0 失败或编译报 “gtk-3 not found”。gtk3-devel 与 glib2-devel,并使用 sudo yum/dnf groupinstall "Development Tools" 补齐构建工具链。vulkan/metal/opengl 的软件实现)或使用 GTK 这类成熟桌面栈以获得更稳定的系统集成体验。