如何在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级别的属性,影响整个项目
  • 必须放在文件最开头,在任何 moduse 语句之前
  • 这是Rust的语法要求

2. cfg_attr - 条件属性

  • cfg_attr 是Rust的条件属性宏
  • 语法:cfg_attr(条件, 属性)
  • 只有当条件满足时,才会应用指定的属性

3. all(windows, not(debug_assertions)) - 条件判断

  • all() 表示所有条件都必须满足
  • windows - 当前平台是Windows
  • not(debug_assertions) - 不是debug模式(即release模式)

4. windows_subsystem = "windows" - 目标属性

  • 当条件满足时,应用这个属性
  • 告诉Windows链接器这是一个GUI应用程序,不是控制台应用程序

实际效果

这个设置的作用是:

在Windows上编译release版本时:

  • 程序会作为Windows GUI应用程序运行
  • 不会显示命令行窗口
  • 用户双击exe文件时直接运行游戏

在Windows上编译debug版本时:

  • 仍然显示命令行窗口
  • 便于开发时查看输出和错误信息

在非Windows平台上:

  • 这个属性不会生效
  • 程序正常编译运行

为什么这样设计?

  1. 开发友好 - Debug模式下保留控制台,方便调试
  2. 用户体验 - Release模式下隐藏控制台,提供更好的用户体验
  3. 跨平台兼容 - 只在Windows上生效,不影响其他平台

与Cargo.toml的配合

现在的Cargo.toml中也有:

[[bin]]
name = "flappy"
path = "src/main.rs"
windows_subsystem = "windows"

这提供了双重保障,确保在Windows上编译时不会出现控制台窗口。

posted @ 2025-08-25 23:24  fengyujia  阅读(14)  评论(0)    收藏  举报