当 运行 时,使用 GTK+3.0 编译的 C 程序失败并出现警告

C Program compiled with GTK+3.0 fails with warning when run

我已经阅读了一些关于如何在 C 程序中将 GTK+ 用于 GUI 的指南,并且我遇到了 this tutorial 在我的系统上获取 GTK+。这是我 运行 逐行显示的所有内容:

chmod +x gtk-osx-build-setup.sh
./gtk-osx-build-setup.sh
cd ~/.local/bin
./jhbuild build python
./jhbuild bootstrap
./jhbuild build meta-gtk-osx-bootstrap
./jhbuild build meta-gtk-osx-core

此时,我还没有发现使用 GTK 头文件编译 C 程序的 pkg-config tick hack,所以当我 运行 gcc main.c -o main 我只是得到了错误 main.c:1:10: fatal error: 'gtk/gtk.h' file not found,但我发现 another tutorial (Command-F "jhbuild build gtk+") 建议我这样做,所以我 运行:

./jhbuild build gtk+

在那之后,我终于找到了其他来源,这些来源建议 运行 使用以下命令来检查我的系统是否可以找到软件包,所以当我 运行 pkg-config gtk+-3.0 --cflags 我得到:

-D_REENTRANT -I/opt/local/include/gtk-3.0 -I/opt/local/include/at-spi2-atk/2.0 -I/opt/local/include/at-spi-2.0 -I/opt/local/include/dbus-1.0 -I/opt/local/lib/dbus-1.0/include -I/opt/local/include/gtk-3.0 -I/opt/local/include/gio-unix-2.0/ -I/opt/local/include -I/opt/local/include/cairo -I/opt/local/include/pango-1.0 -I/opt/local/include/harfbuzz -I/opt/local/include/pango-1.0 -I/opt/local/include/atk-1.0 -I/opt/local/include/cairo -I/opt/local/include/pixman-1 -I/opt/local/include -I/opt/local/include/freetype2 -I/opt/local/include -I/opt/local/include/freetype2 -I/opt/local/include/libpng16 -I/opt/local/include -I/opt/local/include/gdk-pixbuf-2.0 -I/opt/local/include/libpng16 -I/opt/local/include/glib-2.0 -I/opt/local/lib/glib-2.0/include -I/opt/local/include

当我 运行 pkg-config gtk+-3.0 --libs 我得到:

-L/opt/local/lib -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpangoft2-1.0 -lpango-1.0 -lm -lfontconfig -lfreetype -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl

我的 main.c 包含来自 this tutorial 的以下代码:

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    GtkWidget *window;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window), "Window");

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    gtk_widget_show(window);

    gtk_main();

    return 0;
}

当我 运行 gcc -Wall -Wextra -Werror `pkg-config gtk+-3.0 --cflags` main.c -o main `pkg-config gtk+-3.0 --libs`main 创建时没有任何警告或任何东西,但是当我 运行 ./main 我收到此警告,并且程序立即结束:

(main:93199): Gtk-WARNING **: cannot open display:

我的电脑是 2012 年中期的 MacBook Pro 运行ning OS X 10.9.5,配备 2.9 GHz Intel Core i7 处理器(我真的不知道有多少信息需要这个)。我只想解决这个警告,这样我就可以毫无问题地显示一个简单的 window。

更新: 我注意到我安装了 gtk+ 而不是 gtk+-3.0,所以我 运行 ~/.local/bin/jhbuild build gtk+-3.0 安装它。当我 运行 ~/.local/bin/jhbuild info gtk+-3.0 时,我得到:

Name: gtk+-3.0
Module Set: gtk-osx
Type: autogen
Install version: 3.14.5-b4ea7a7455981175cb26a7a1a49b765e
Install date: 2015-01-27 23:49:55
URL: http://ftp.gnome.org/pub/GNOME/sources/gtk+/3.14/gtk+-3.14.5.tar.xz
Version: 3.14.5
Tree-ID: 3.14.5-b4ea7a7455981175cb26a7a1a49b765e
Sourcedir: ~/gtk/source/gtk+-3.14.5
Requires: glib, pango, atk, gdk-pixbuf, gobject-introspection
Required by: meta-gtk-osx-gtk3, goocanvas2, gtkmm3
After: meta-gtk-osx-bootstrap
Before: gtk-mac-integration

但是,即使在重新编译 C 程序之后,我仍然遇到同样的错误。

作为n.m。建议,我尝试了 installing XQuartz,现在效果很好。

OSX 上的 运行 GTK 程序需要 X 服务器绝对不是真的。当你通过 gtk-osx-build 安装它时,正如你所做的那样,它使用 Quartz 后端,这允许它在 OSX.

上本地 运行

但是,您的 pkg-config 输出显示您正在获取安装在 /opt/local 中的不同 GTK 副本,很可能来自 MacPorts。 gtk-osx-build 的默认安装位置是 ~/gtk/inst 我假设你没有改变。另一个副本可能不是使用 Quartz 后端构建的。

请记住,您需要在 jhbuild shell 中编译和 运行 您的程序,至少在将其捆绑到应用程序之前是这样。否则编译器将无法在 ~/gtk/inst.

中找到可执行文件和库

如果可以的话,我还建议从 /opt/local 卸载另一个 GTK 副本,以避免将来出现此类问题。