当 运行 时,使用 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 副本,以避免将来出现此类问题。
我已经阅读了一些关于如何在 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 副本,以避免将来出现此类问题。