Rev*_*ron 16 windows console rust
我正在尝试开发一个使用sdl2库的程序.它到目前为止工作得很好,但是当我运行程序时,我得到两个窗口 - sdl2窗口和控制台窗口.
如何隐藏或不创建控制台窗口?也许有某种WinMain
?
Art*_*mGr 19
Rust 1.18引入了Windows子系统属性.关闭控制台:
#![windows_subsystem = "windows"]
Run Code Online (Sandbox Code Playgroud)
Rust二进制文件与GCC工具链相关联.要在不生成命令行窗口的情况下启动程序,需要将-mwindows
选项传递给链接器.
Cargo 有一种cargo rustc
模式可用于传递额外的标志rustc
.在介绍之前,没有已知的方法将选项传递给Cargo的编译器.
在这些情况下,一种解决方法是在创建窗口后隐藏窗口:
extern crate winapi;
extern crate user32;
extern crate kernel32;
use std::ptr;
fn hide_console_window() {
let window = unsafe {kernel32::GetConsoleWindow()};
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx
if window != ptr::null_mut() {
unsafe {
user32::ShowWindow(window, winapi::SW_HIDE);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要在Cargo.toml中进行以下编译:
[dependencies]
winapi = "*"
user32-sys = "*"
kernel32-sys = "*"
Run Code Online (Sandbox Code Playgroud)
要使其能够从现有的控制台或IDE运行它:
fn hide_console_window() {
unsafe { kernel32::FreeConsole() };
}
Run Code Online (Sandbox Code Playgroud)
第二种方法对我不起作用,因为我从批处理文件启动我的应用程序.你看,批处理仍然拥有控制台,所以它保持在屏幕上的外观.
过了一段时间,我找到了一个完美的答案!货物现在有非常有用的子命令 - rustc
.
完整的构建命令是这样的:
cargo rustc -- -Clink-args="-Wl,--subsystem,windows"
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用常规构建调试版本cargo build
,当我们需要进行最终构建时,我们可以使用以下命令:
cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows"
Run Code Online (Sandbox Code Playgroud)
很快,https://github.com/rust-lang/rust/pull/37501将登陆,这是RFC 1665的一个实现,正确答案将是
#![windows_subsystem = "windows"]
Run Code Online (Sandbox Code Playgroud)
在您的箱子根.
如果您使用MSVC工具链,则需要添加到Roman Quick的答案,而是要传递MSVC链接器args.
cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"
Run Code Online (Sandbox Code Playgroud)