Winlibs MinGW-w64 GCC 环境如何安装并使用 GTK4?
结论
仅把 GTK 仓库克隆到 c:\mingw\gtk,还不能直接编译 GTK4 应用。克隆得到的是源码,编译应用还需要安装好的 GTK4 头文件、链接库、依赖库和运行时 DLL。把源码放在 GCC 目录下不会自动完成这些配置。
如果想先运行一个 C 窗口程序,建议使用 MSYS2 UCRT64 提供的 GTK4 和 GCC。这是 GTK 官方列出的 Windows 安装方式,使用的是 MSYS2 编译器。如果必须继续使用现有 Winlibs,还需要确认二进制兼容性。GTK Windows 安装说明
原示例也没有创建窗口的代码。即使编译成功,程序也不会自动显示窗口,需要添加 activate 回调。
1. 安装 GTK4 开发环境
以下命令以 x86_64 Windows 环境为前提。原问题只列出了 UCRT 和线程模型,没有明确工具链的目标位数。如果要与现有 Winlibs 混用,应先确认它也是 x86_64。
从 MSYS2 官网安装 MSYS2,然后打开开始菜单中的 MSYS2 UCRT64 终端,执行:
pacman -Syu
如果更新时提示关闭终端,按提示操作后重新打开 UCRT64 终端,再次运行上述命令,完成更新。MSYS2 只支持完整系统升级。MSYS2 更新说明
然后安装 GCC、GTK4 和提供 pkg-config 命令的 pkgconf:
pacman -S --needed mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gtk4 mingw-w64-ucrt-x86_64-pkgconf
pacman 会处理 GTK4 所需的依赖。这里使用的 GTK4 包来自 UCRT64 仓库。GTK4 包信息
检查当前环境:
echo "$MSYSTEM"
which gcc
which pkg-config
pkg-config --modversion gtk4
确认环境为 UCRT64,编译器和 pkg-config 来自 /ucrt64/bin。UCRT64 终端默认将这个目录放在 PATH 前面,避免误用其他工具链。MSYS2 环境说明
2. 编写能显示窗口的程序
把下面的代码保存为 main.c。它保留了原示例的应用初始化流程,并添加了窗口创建逻辑:
#include <gtk/gtk.h>
static void
on_activate(GtkApplication *app, gpointer user_data)
{
(void) user_data;
GtkWidget *window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "GTK4 demo");
gtk_window_set_default_size(GTK_WINDOW(window), 480, 320);
gtk_window_present(GTK_WINDOW(window));
}
int
main(int argc, char **argv)
{
GtkApplication *app;
int stat;
app = gtk_application_new("com.github.ToshioCP.pr1",
G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);
stat = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return stat;
}
activate 回调负责创建并显示窗口。原程序只创建了 GtkApplication 对象,没有连接这个信号,也没有创建 GtkApplicationWindow。GTK 入门说明
3. 编译并运行
在 UCRT64 终端进入 main.c 所在目录,执行:
gcc $(pkg-config --cflags gtk4) main.c -o gtk-demo.exe $(pkg-config --libs gtk4)
./gtk-demo.exe
pkg-config --cflags gtk4 提供头文件路径等编译参数,pkg-config --libs gtk4 提供库路径和链接参数。将链接参数放在源文件后面,可以避免常见的链接顺序问题。GTK 官方示例也使用这种编译方式。GTK 编译示例
这里使用的是 Bash 命令语法,应在 MSYS2 UCRT64 终端执行。pkg-config 是命令名称;MSYS2 默认由 pkgconf 实现该命令。MSYS2 pkg-config 说明
先在同一终端运行程序,可以利用已配置好的 DLL 搜索路径。如果要从其他终端或 IDE 启动,需要为该进程配置相应的运行时路径。例如,MSYS2 安装在默认位置时,UCRT64 的 DLL 目录通常是 C:\msys64\ucrt64\bin。
4. 如果必须保留 Winlibs GCC
可以尝试让 Winlibs 使用 MSYS2 UCRT64 安装的 GTK4 开发库,但不能仅凭两者都标注 UCRT 就保证兼容。还应核对目标架构、导入库和 GCC 运行时依赖,尤其要避免从不同工具链目录加载同名运行时 DLL。
假设你的 Winlibs 编译器实际位于 C:\mingw\bin\gcc.exe,可以在已经安装 GTK4 的 UCRT64 终端中尝试:
/c/mingw/bin/gcc.exe $(pkg-config --cflags gtk4) main.c -o gtk-demo-winlibs.exe $(pkg-config --libs gtk4)
./gtk-demo-winlibs.exe
请将编译器路径替换成实际位置。这个命令只说明如何把 GTK4 的编译和链接参数交给 Winlibs,并未验证你所列版本与 MSYS2 二进制包的组合。
如果项目要求整套依赖都由指定的 Winlibs 工具链构建,需要先准备 GTK4 及其依赖的构建环境,再使用 Meson 配置、编译和安装。GTK 官方构建文档列出了流程和依赖;只克隆 GTK 仓库不能省掉这些工作。GTK 源码构建说明
5. 常见问题如何定位
gtk/gtk.h: No such file or directory:检查 GTK4 开发包是否安装,以及编译命令是否包含pkg-config --cflags gtk4的输出。只添加源码目录通常不够。Package gtk4 was not found:检查是否打开 UCRT64 终端,以及pkg-config是否来自同一环境。GTK4 的模块名是gtk4。undefined reference to gtk_...:检查是否传入pkg-config --libs gtk4,并将库参数放在源文件或目标文件后面。- 启动时提示缺少 DLL:先在 UCRT64 终端运行,检查运行时搜索路径。把程序交给其他电脑使用时,还需要打包 GTK 及其运行时依赖,单独复制
.exe不够。GTK Windows 分发说明 - 程序没有窗口:确认使用了包含
activate回调和gtk_window_present()的示例。
备注:内容仅供参考。
