如何在没有 MSYS2 的 Windows 上构建 GTK+3 程序?

Posted

技术标签:

【中文标题】如何在没有 MSYS2 的 Windows 上构建 GTK+3 程序?【英文标题】:How to build a GTK+3 program on Windows without MSYS2? 【发布时间】:2019-06-27 04:41:23 【问题描述】:

我想用 GTK+3 编译代码。不使用 MSYS2 或 Visual Studio。 我收到“未定义的引用”

首先,尝试使用官方页面上的本教程:https://www.gtk.org/download/windows.php,但使用 MSYS2 时一团糟;另外,我不想要类似 linux 的环境,也不想要类似 unix 的环境(更不用说 Visual Studio)。

我下载了版本 2 的“all in one bundle”,设置了环境变量和所有这些东西。一切正常,代码编译! (来自版本 2 的代码)。然后我尝试更改为版本 3,从:http://www.tarnyko.net/dl/gtk.htm

当然,环境变量已更新,编译行中的库版本也已更新。该程序是针对第3版的,特别是官方网站中的第一个:https://developer.gnome.org/gtk3/stable/gtk-getting-started.html。没用。

然后,按照本教程进行操作:http://www.tarnyko.net/repo/gtk3_build_system/tutorial/gtk3_tutorial.htm

我用命令的结果重写了编译行:pkg-config --cflags --libs gtk+-3.0(如上面的教程所说)

版本 2(正常工作)的编译行是:

gcc -Wall -g test.c -o test -mms-bitfields -Ic:/gtk/include/gtk-2.0 -Ic:/gtk/lib/gtk-2.0/include -Ic:/gtk/include/atk-1.0 -Ic:/gtk/include/cairo -Ic:/gtk/include/gdk-pixbuf-2.0 -Ic:/gtk/include/pango-1.0 -Ic:/gtk/include/glib-2.0 -Ic:/gtk/lib/glib-2.0/include -Ic:/gtk/include -Ic:/gtk/include/freetype2 -Ic:/gtk/include/libpng14 -Lc:/gtk/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl

版本 3(我要问的那个)的编译行是:

gcc -Wall -g iniciando.c -o iniciando -mms-bitfields -IC:/gtk3/include/gtk-3.0 -IC:/gtk3/include/cairo -IC:/gtk3/include/pango-1.0 -IC:/gtk3/include/atk-1.0 -IC:/gtk3/include/cairo -IC:/gtk3/include/pixman-1 -IC:/gtk3/include -IC:/gtk3/include/freetype2 -IC:/gtk3/include -IC:/gtk3/include/libpng15 -IC:/gtk3/include/gdk-pixbuf-2.0 -IC:/gtk3/include/libpng15 -IC:/gtk3/include/glib-2.0 -IC:/gtk3/lib/glib-2.0/include -LC:/gtk3/lib -lgtk-3 -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lpangocairo-1.0 -lpangoft2-1.0 -lfreetype -lfontconfig -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lm -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl

最后一个库(intl)一开始就出现了问题,因为它不存在于它应该存在的地方,并且没有编译;我删除了它并得到了我要求的错误,然后从我的 GTK 2 中复制了 intl(只是为了看看发生了什么),错误是一样的。

我希望程序被编译;但我得到了:undefined reference to: 'gtk_main_quit'(以及所有 GTK 函数)。

【问题讨论】:

【参考方案1】:

首先,忘记使用 GTK+ 2,一旦 GTK+ 4 发布(可能在今年夏天),它就会被弃用。使用稳定多年的 GTK+ 3。

其次,忘记关于 Tarniko 网站上的说明的所有内容。虽然他当时做得很好,但这些指令现在已经完全过时了,并且预编译的二进制文件适用于 GTK+ 的过时版本(3.6 于 2012 年 9 月发布,而最新版本是 3.24 于 2018 年 9 月发布)

除了 MSYS 或 vcpkg 软件包提供的那些之外,没有官方预编译的二进制文件。您可能会发现一些最新的和非官方的捆绑包,like this one(从未尝试过),但是从不受信任的来源获取二进制文件可能是一个安全问题。

接下来,如果你真的想构建一些东西,你需要一个工具链。您似乎已经安装了 gcc,您是如何安装的?如果您想使用预编译的二进制文件,您必须自己安装和配置工具链,因为这是特定于您的设置的。通常为了避免兼容性问题,您需要用于构建依赖项的相同工具链,这就是 MSYS 提供的。

最后,您可能只是从源代码构建整个东西,因为最近的 GTK+ 版本可以使用 Meson 构建系统构建,在 Windows 上应该可以正常构建。

但实际上,如果您已经打算使用 gcc,请帮自己一个忙并安装 MSYS2。您将获得 GTK+、一个工具链以及绑定,以及 glade 和 devhelp 等其他工具,如果您想做一些严肃的 GTK+ 开发,可能需要这些工具(至少对 Glade 而言)。

【讨论】:

以上是关于如何在没有 MSYS2 的 Windows 上构建 GTK+3 程序?的主要内容,如果未能解决你的问题,请参考以下文章

调试使用 mingw/msys2 构建的 Windows 服务

使用 MSYS2/MINGW-64 缺少 POSIX 和 std 符号

msys2:尽管没有找到 Windows 程序(MSYS2_PATH_TYPE = 继承)

如何在 Windows 7+ 和 MSYS2 上的 GTK3 上获取本机 Windows 装饰

如何使用 MSYS2 在 Windows 上安装 GTK3 和 minGW

如何在 MSYS2 上安装 libpng?