如何用cl编译器编译Windows Gtk3 C程序时隐藏控制台窗口
在Windows上用Visual Studio cl编译器编译Gtk3程序消除控制台窗口的解决方案
问题场景
Windows 11(x86_64)环境下,因mingw/MSYS2表现不稳定,改用Visual Studio自带的原生cl编译器编译C语言编写的Gtk3程序(依赖gvsbuild脚本构建的Gtk3库)。程序通过编译器响应文件配置编译链接选项后可成功编译,但运行时会弹出后台控制台窗口。
尝试过的无效方案
- 链接时指定
/SUBSYSTEM:WINDOWS,编译器报错找不到被Gtk隐藏的WinMain入口 - 尝试
/D"subsystem,windows"、/Dmwindows、/Dsubsystem=gui等预定义宏,无法消除控制台窗口 - 添加Windows API代码尝试隐藏控制台,编译器找不到相关代码定义
原始测试代码
#include <gtk/gtk.h> static void activate (GtkApplication * app, gpointer user_data) { GtkWidget * window; window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "Hello internet from Gtk Windows!"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); gtk_widget_show_all (window); } int main (int argc, char ** argv) { GtkApplication * app; int status; app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return status; }
解决方法
通过以下修改即可解决问题:
- 链接选项中指定
/SUBSYSTEM:WINDOWS - 修改程序入口为WinMain,并做跨平台兼容处理
- 调用
g_application_run时将argc参数设为0(若程序无需处理命令行参数则无影响)
修改后的代码如下:
#include <gtk/gtk.h> static void activate (GtkApplication * app, gpointer user_data) { GtkWidget * window; window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "Hello internet from Gtk Windows!"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); gtk_widget_show_all (window); } #ifdef _WIN32 int WinMain (void * hInstance, void * hPrevInstance, char ** argv, int nCmdShow) #else int main (int argc, char ** argv) #endif { GtkApplication * app; int status; app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), 0, argv); g_object_unref (app); return status; }
内容的提问来源于stack exchange,提问作者Will B
相关产品推荐
相关产品推荐

