ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Rust 在release模式下编译 Windows exe去除黑窗口详细教程

Rust 在release模式下编译 Windows exe去除黑窗口详细教程 Rust 在release模式下编译 Windows exe去除黑窗口详细教程一、处理步骤1、修改Cargo.toml2、修改main.rs二、实现原理1、windows-subsystem windows 的作用2、cfg_attr 与 not(debug_assertions) 的编译期判断3、整体工作流程4、小结一、处理步骤1、修改Cargo.toml新增下面内容[[bin]]nameBatterySwitchpathsrc/main.rswindows-subsystemwindows如下所示黄色框里面的内容要保持一样。2、修改main.rs在main.rs最前面新增#![cfg_attr(not(debug_assertions), windows_subsystem windows)]二、实现原理1、windows-subsystem windows的作用在 Rust 中默认情况下编译出的 Windows 可执行程序是控制台子系统程序。也就是说当你双击运行它时系统会先弹出一个黑色的命令行窗口程序的所有标准输出println!等都会输出到这个控制台里。对于像电池电量监控这种后台常驻型程序我们并不希望每次启动都弹出一个黑框。因此需要在编译配置中声明程序属于Windows GUI 子系统在Cargo.toml的[[bin]]段中写入windows-subsystem windows告诉编译器这个二进制程序不需要控制台窗口。在main.rs最前面写入#![cfg_attr(not(debug_assertions), windows_subsystem windows)]它的含义是仅在 release发布模式下隐藏控制台窗口而在 debug调试模式下仍然保留控制台方便开发时查看println!打印的日志。两种写法效果等价区别在于Cargo.toml中的配置对 debug 和 release 都生效而cfg_attr写法可以做到「调试时显示控制台、发布时隐藏控制台」更利于开发调试。2、cfg_attr与not(debug_assertions)的编译期判断#![cfg_attr(条件, 属性)]是 Rust 的条件编译属性它的执行时机在编译期而不是程序运行期cfg_attr会根据括号内的条件在编译时决定是否把第二个参数即windows_subsystem windows附加到当前 crate 上。not(debug_assertions)是一个内置的编译条件当使用cargo build --release编译时debug_assertions为false取反后为true于是该属性生效当使用cargo build默认 debug 模式编译时debug_assertions为true取反后为false该属性不生效。因此这一行代码的本质是在发布版本中隐藏控制台窗口在调试版本中保留控制台窗口从而兼顾「用户体验」与「开发调试」两个需求。3、整体工作流程整个程序的实现原理可以概括为以下几个环节编译期通过Cargo.toml或cfg_attr声明 GUI 子系统使最终生成的.exe在运行时不再弹出黑色控制台窗口。运行期程序启动后作为后台进程常驻系统周期性读取电池电量信息。交互期当电量达到设定的阈值如低电量或充满时程序通过系统通知或弹窗等方式提醒用户。是否编写 Cargo.toml 与 main.rs编译期cfg_attr 判断 release 模式是否为 release 构建隐藏控制台窗口保留控制台窗口便于调试生成 GUI 子系统 exe运行期后台常驻监控电池电量电量达到阈值时提醒用户4、小结通过以上配置我们实现了两个目标用户侧程序以无窗口的 GUI 方式运行双击启动后不会弹出黑框体验更接近原生桌面应用。开发者侧debug 模式下仍能看到控制台输出方便打印日志和排查问题release 模式下自动隐藏控制台交付给用户时界面干净整洁。这正是windows-subsystem与cfg_attr组合使用的核心价值所在。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进