前言

GTK(原名 GIMP Toolkit)是一个免费、开源、跨平台的工具包,用于创建图形用户界面。简单来说,它提供了一系列的“积木块”(如按钮、文本框、下拉菜单等),开发者可以用这些积木块来构建应用程序的窗口和界面。

之前曾在Linux上接触过一点GTK,但最近想在Windows系统下的VS2022中来学习使用它,在此,记录一下我的配置过程。

准备

  • 一台电脑(不用我说吧)
  • Windows系统(最好是Windows10/11)
  • 安装好的VS2022(需要在Visual Studio Installer中勾选“使用C++的桌面开发”)

开始

根据GTK官网的描述,在Windows上使用GTK有两种方法,MSYS2或gvsbuild。

Gtk

我尝试使用MSYS2来安装GTK,开始时一切顺利,但在VS2022中配置时,出现了问题,它似乎与MSVC编译器不兼容。

随后,我尝试第二个方法,在gvsbuild的Github的页面里,有这样一段信息:

gvsbuild

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

根据链接,到这个页面,下载GTK

download_gtk

这里根据你的需求选择(GTK3已进入维护状态,不再有新功能更新;GTK4更新较活跃,引入更现代化的特性),方法通用,但配置过程略有不同。

下载后,解压,这里我把压缩包内容解压至E:\GTK,你也可以解压到其他目录,但要记得记下路径。

unzip

随后,开始编辑系统环境变量。

环境变量

打开“开始”菜单,输入“环境变量”并选择“编辑系统环境变量”。

在打开的界面中,选择“环境变量”

编辑系统环境变量

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

环境变量

变量名:GTK_HOME(或者改成你喜欢的,建议保持一致)

变量值:E:\GTK(这里应是你解压刚才的那个压缩包的位置)

新建

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

Path

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

Path

环境变量方面的配置就完成了。

配置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编译运行,若能正常编译运行(它应能显示一个空白的窗口),说明配置完成。

运行