前言
GTK(原名 GIMP Toolkit)是一个免费、开源、跨平台的工具包,用于创建图形用户界面。简单来说,它提供了一系列的“积木块”(如按钮、文本框、下拉菜单等),开发者可以用这些积木块来构建应用程序的窗口和界面。
之前曾在Linux上接触过一点GTK,但最近想在Windows系统下的VS2022中来学习使用它,在此,记录一下我的配置过程。
准备
- 一台电脑(不用我说吧)
- Windows系统(最好是Windows10/11)
- 安装好的VS2022(需要在Visual Studio Installer中勾选“使用C++的桌面开发”)
开始
根据GTK官网的描述,在Windows上使用GTK有两种方法,MSYS2或gvsbuild。

我尝试使用MSYS2来安装GTK,开始时一切顺利,但在VS2022中配置时,出现了问题,它似乎与MSVC编译器不兼容。
随后,我尝试第二个方法,在gvsbuild的Github的页面里,有这样一段信息:

【翻译】如果你只想在 Windows 上运行 GTK 而不自己构建它,你可以从最新版本下载一个压缩文件并解压到 C:\gtk。
根据链接,到这个页面,下载GTK

这里根据你的需求选择(GTK3已进入维护状态,不再有新功能更新;GTK4更新较活跃,引入更现代化的特性),方法通用,但配置过程略有不同。
下载后,解压,这里我把压缩包内容解压至E:\GTK,你也可以解压到其他目录,但要记得记下路径。

随后,开始编辑系统环境变量。
环境变量
打开“开始”菜单,输入“环境变量”并选择“编辑系统环境变量”。
在打开的界面中,选择“环境变量”

在系统变量下,选择“新建”

变量名:GTK_HOME(或者改成你喜欢的,建议保持一致)
变量值:E:\GTK(这里应是你解压刚才的那个压缩包的位置)

完成后,点击选中用户变量的Path项,选择“编辑”

新建,填入%GTK_HOME%\bin (取决于你之前环境变量的命名),然后一路点“确定”

环境变量方面的配置就完成了。
配置VS2022
在VS2022中,新建空项目(C++),然后,打开项目属性
如果是GTK3
C/C++ → 常规 → 附加包含目录(按顺序添加)
$(GTK_HOME)\include\gtk-3.0
$(GTK_HOME)\include\glib-2.0
$(GTK_HOME)\lib\glib-2.0\include
$(GTK_HOME)\include\pango-1.0
$(GTK_HOME)\include\harfbuzz
$(GTK_HOME)\include\cairo
$(GTK_HOME)\include\gdk-pixbuf-2.0
$(GTK_HOME)\include\atk-1.0

链接器 → 常规 → 附加库目录
$(GTK_HOME)\lib

链接器 → 输入 → 附加依赖项
gtk-3.lib
gdk-3.lib
pangocairo-1.0.lib
pango-1.0.lib
harfbuzz.lib
atk-1.0.lib
cairo-gobject.lib
cairo.lib
gdk_pixbuf-2.0.lib
gio-2.0.lib
gobject-2.0.lib
glib-2.0.lib
intl.lib

点击确定之后,项目就配置好了。
如果是GTK4
C/C++ → 常规 → 附加包含目录(按顺序添加)
$(GTK_HOME)\include\gtk-4.0
$(GTK_HOME)\include\glib-2.0
$(GTK_HOME)\lib\glib-2.0\include
$(GTK_HOME)\lib\graphene-1.0\include
$(GTK_HOME)\include\pango-1.0
$(GTK_HOME)\include\harfbuzz
$(GTK_HOME)\include\cairo
$(GTK_HOME)\include\gdk-pixbuf-2.0
$(GTK_HOME)\include\graphene-1.0
链接器 → 常规 → 附加库目录
$(GTK_HOME)\lib
链接器 → 输入 → 附加依赖项
gtk-4.lib
gdk_pixbuf-2.0.lib
graphene-1.0.lib
pangowin32-1.0.lib
pangocairo-1.0.lib
pango-1.0.lib
harfbuzz.lib
cairo.lib
gobject-2.0.lib
glib-2.0.lib
gmodule-2.0.lib
gio-2.0.lib
intl.lib
测试运行
在项目中添加源码文件,粘贴以下测试代码
GTK+3
#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), "GTK3 Test");
gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
gtk_widget_show_all(window);
}
int main(int argc, char** argv) {
GtkApplication* app;
int status;
app = gtk_application_new("com.example.gtkapp", 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;
}
GTK+4
#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), "Window");
gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
gtk_window_present(GTK_WINDOW(window));
}
int main(int argc, char** argv)
{
GtkApplication* app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
Ctrl+F5编译运行,若能正常编译运行(它应能显示一个空白的窗口),说明配置完成。
