如何在windows下,关闭release打包后,启动出现的黑框,以及保留debug模式的console
关闭控制台
#![...] 这种 crate 级别属性 只能放在 文件的最开头,在任何 mod、use 之前
#![cfg_attr(windows, windows_subsystem = "windows")]
关闭release模式控制台,但是保留debug模式的
#![cfg_attr(all(windows, not(debug_assertions)), windows_subsystem = "windows")]
语法解析
#![cfg_attr(all(windows, not(debug_assertions)), windows_subsystem = "windows")]
这是一个条件编译属性,让我逐部分解释:
1. #! - Crate级别属性
#!表示这是一个crate级别的属性,影响整个项目- 必须放在文件最开头,在任何
mod、use语句之前 - 这是Rust的语法要求
2. cfg_attr - 条件属性
cfg_attr是Rust的条件属性宏- 语法:
cfg_attr(条件, 属性) - 只有当条件满足时,才会应用指定的属性
3. all(windows, not(debug_assertions)) - 条件判断
all()表示所有条件都必须满足windows- 当前平台是Windowsnot(debug_assertions)- 不是debug模式(即release模式)
4. windows_subsystem = "windows" - 目标属性
- 当条件满足时,应用这个属性
- 告诉Windows链接器这是一个GUI应用程序,不是控制台应用程序
实际效果
这个设置的作用是:
在Windows上编译release版本时:
- 程序会作为Windows GUI应用程序运行
- 不会显示命令行窗口
- 用户双击exe文件时直接运行游戏
在Windows上编译debug版本时:
- 仍然显示命令行窗口
- 便于开发时查看输出和错误信息
在非Windows平台上:
- 这个属性不会生效
- 程序正常编译运行
为什么这样设计?
- 开发友好 - Debug模式下保留控制台,方便调试
- 用户体验 - Release模式下隐藏控制台,提供更好的用户体验
- 跨平台兼容 - 只在Windows上生效,不影响其他平台
与Cargo.toml的配合
现在的Cargo.toml中也有:
[[bin]]
name = "flappy"
path = "src/main.rs"
windows_subsystem = "windows"
这提供了双重保障,确保在Windows上编译时不会出现控制台窗口。
浙公网安备 33010602011771号