GTK C ++: не удалось найти обработчик сигнала. Вы скомпилировали с -rdynami c? - PullRequest
0 голосов
/ 12 января 2020

Я новичок в программировании GTK и столкнулся со следующей проблемой. Я могу скомпилировать код без каких-либо предупреждений или ошибок, однако, когда я выполняю двоичный файл, я получаю этот массаж, и кнопка не работает. Ошибка выглядит следующим образом:

(проект: 9686): Gtk-WARNING **: 16: 26: 31.359: Не удалось найти обработчик сигнала 'on_button_clicked'. Вы скомпилировали с -rdynami c?

Это код:

#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

Я пытался скомпилировать с:

  • -rdynami c
  • -Wl, - export-Dynami c
  • -lgmodule-2.0
  • pkg-config --cflags --libs gtk+-3.0 gmodule-no-export-2.0

, но ничего не работает.

1 Ответ

1 голос
/ 19 января 2020

Трудно сказать наверняка, но я предполагаю, что проблема в том, что вы компилируете с использованием компилятора C ++, тогда как ваш пример написан на C. Компилятор C ++ "искажает" имена ваших экспортируемых символов. Если вы не пишете остальную часть своей программы на C ++, я бы порекомендовал компилировать с gcc -std=c99 вместо g++ -std=c++0x.

С другой стороны, если остальная часть вашей программы должна быть написанный на C ++, вам нужно будет поставить перед каждым символом, который вы хотите экспортировать, для GtkBuilder (который не знает о искажениях имен C ++ ) с помощью extern "C", или поместить их все вместе в один или несколько extern "C" { ... } блоков. Это предотвратит искажение имени, поэтому GtkBuilder сможет его найти.

Чтобы проверить, так ли это, попробуйте запустить nm -g | grep on_button_clicked (без какой-либо опции "demangle") для вашего скомпилированного файла. , Если имя искажено, вы увидите что-то вроде __Z17on_button_clicked13BLAH14BLAH, тогда как если это не так, то вы просто увидите _on_button_clicked.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...