GTK C ++:找不到信号处理程序,是否使用-rdynamic进行编译?

问题描述 投票:0回答:1

我是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

我尝试使用:

  • -rdynamic
  • -Wl,-export-dynamic
  • -lgmodule-2.0
  • pkg-config --cflags --libs gtk+-3.0 gmodule-no-export-2.0

但无济于事。

c++ linux gtk
1个回答
1
投票

很难确定,但是我想问题是您正在使用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

© www.soinside.com 2019 - 2024. All rights reserved.