Как создать программу, которая не отображает окно консоли?

Я пытаюсь разработать программу, использующую библиотеку sdl2. Он отлично работает до сих пор, но когда я запускаю программу, я получаю два окна - окно sdl2 и окно консоли.

Как я могу скрыть или не создать окно консоли? Может быть, есть что-то вроде WinMain?

4 ответа

Rust 1.18 представил атрибут подсистемы Windows. Выключите консоль с помощью:

#![windows_subsystem = "windows"]

Двойные файлы 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);
 }
 }
}

Вам понадобится следующее в Cargo.toml, чтобы скомпилировать его:

[dependencies]
winapi = "*"
user32-sys = "*"
kernel32-sys = "*"

Чтобы выполнить запуск с существующей консоли или среды IDE, выполните следующие действия.

fn hide_console_window() {
 unsafe { kernel32::FreeConsole() };
}

Этот второй метод не работает для меня, потому что я запускаю свое приложение из пакетного файла. Понимаете, пакет все еще владеет консолью, поэтому он остается на экране.


Через некоторое время я нашел отличный ответ! Теперь у груза есть очень полезная подкоманда - rustc.

Команда полной сборки выглядит так:

cargo rustc -- -Clink-args="-Wl,--subsystem,windows"

Теперь мы можем создавать сборки отладки с регулярными cargo build, и когда нам нужно сделать окончательную сборку, мы можем использовать эту команду:

cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows"


Вскоре https://github.com/rust-lang/rust/pull/37501 приземлится, что является реализацией RFC 1665, и правильный ответ будет

#![windows_subsystem = "windows"]

в корне вашей корзины.


Добавление в Roman Быстрый ответ, если вы используете программную цепочку MSVC, вы захотите передать MSVC-компоновщики ссылок.

cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"

licensed under cc by-sa 3.0 with attribution.