我是GTK编程的新手,我面临以下问题。我可以编译代码而没有任何警告或错误,但是当我执行二进制文件时,得到此提示,并且按钮不起作用。错误看起来像这样:
((project:9686):Gtk-WARNING **:16:26:31.359:找不到信号处理程序'on_button_clicked'。您使用-rdynamic进行编译了吗?
这是代码:
#include <gtk/gtk.h>
static const gchar *interface =
"<interface>"
" <object class=\"GtkWindow\" id=\"main-window\">"
" <signal name=\"destroy\" handler=\"gtk_main_quit\"/>"
" <child>"
" <object class=\"GtkButton\" id=\"my-button\">"
" <property name=\"label\">Hallo, Welt!</property>"
" <signal name=\"clicked\" handler=\"on_button_clicked\"/>"
" </object>"
" </child>"
" </object>"
"</interface>";
G_MODULE_EXPORT void on_button_clicked (GtkWidget *w, gpointer d)
{
g_print ("Hallo, Welt!\n");
}
int main (int argc, char *argv[])
{
GtkBuilder *builder;
GError *error = NULL;
GtkWidget *window;
gtk_init (&argc, &argv);
builder = gtk_builder_new ();
gtk_builder_add_from_string (builder, interface, -1, &error);
gtk_builder_connect_signals (builder, NULL);
window = GTK_WIDGET(gtk_builder_get_object (builder, "main-window"));
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
我正在Linux机器上工作,并且使用以下命令在终端中进行了编译:
g++ -Wall -std=c++0x project.cpp `pkg-config --cflags --libs gtk+-3.0 gmodule-2.0` -o project
我尝试使用:
pkg-config --cflags --libs gtk+-3.0 gmodule-no-export-2.0
但无济于事。
很难确定,但是我想问题是您正在使用C ++编译器进行编译,而您的示例是用C编写的。C++编译器正在“破坏”导出符号的名称。如果您不是用C ++编写程序的其余部分,那么我建议您使用gcc -std=c99
而不是g++ -std=c++0x
进行编译。
[另一方面,如果程序的其余部分确实需要用C ++编写,那么您将需要为要为GtkBuilder导出的每个符号(不知道C++ name mangling)加上extern "C"
前缀。 ,或将它们全部放置在一个或多个extern "C" { ... }
块中。这将防止名称被篡改,因此GtkBuilder将能够找到它。
要检查是否是这种情况,请尝试在已编译的文件上运行nm -g | grep on_button_clicked
(没有任何“ demangle”选项)。如果名称不正确,您会看到类似__Z17on_button_clicked13BLAH14BLAH
的名称,否则,您只会看到_on_button_clicked
。