LINUX.ORG.RU

gtkmm.h Gtk-WARNING **: Could not find signal handler

 , ,


0

2

Привет. Пишу небольшую программу, надо прикрутить граф. интерфейс.

Создал форму с помощью Glade, весь код приводить не буду, там лишнего много, приведу лишь нужный кусочек:

<child>
          <object class="GtkButton" id="cpubut">
            <property name="label" translatable="yes">Центральный процессор</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="cpupress" object="label1" swapped="no"/>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">0</property>
          </packing>
        </child>

Собственно, <signal name=«clicked» handler=«cpupress», обработчик cpupress

Пишу на С++. Поключаю дл gtk+ заголовочный файл gtkmm.h

Далее код на С++ выглядит так (лишнее выкинул):

#include <gtkmm.h>

using namespace std;


 G_MODULE_EXPORT  void cpupress (GtkButton *button, GtkLabel *label)
{
        gtk_label_set_text (label, "Привет, Хабр!");
}

static GtkWidget *create_window (void)
{
        GtkWidget *window;
        GtkBuilder *builder;
        GError* error = NULL;
        builder = gtk_builder_new ();
        if (!gtk_builder_add_from_file (builder, "/home/vodka/programming/Diplomcpp/ui.glade", &error))
        {
                g_critical ("Не могу загрузить файл: %s", error->message);
                g_error_free (error);
        }
        gtk_builder_connect_signals (builder, NULL);
        window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
        if (!window)
        {
                /* что-то не так, наверное, ошиблись в имени */
                g_critical ("Ошибка при получении виджета окна");
        }
        g_object_unref (builder);

        return window;
}


int main(int argc, char *argv[])
{
    GtkWidget *window;
    gtk_init (&argc, &argv);
    window = create_window ();
    gtk_widget_show (window);
    gtk_main ();
    return 0;
}
.

Так вот, при запуске ошибка появляется Gtk-WARNING **: Could not find signal handler 'cpupress'. Did you compile with -rdynamic?

Хотел бы спросить, где я допускаю ошибку?

★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

добавь -rdynamic или -export-dynamic компилятору при сборке

G_MODULE_EXPORT вроде как только для винды канает

ananas ★★★★★
()
Ответ на: комментарий от iljuase

я хрен его знает, как в этом вашем code::block что-то добавлять. но это опции линкера, не для компиляции. судя по картинке - следующая вкладка

ananas ★★★★★
()
Ответ на: комментарий от ananas

РЕШЕНО!!!

Ладно, спасибо. Надо мне с CODE::BLOCK разобраться. Через терминал всё работает.

Если кому пригодиться: vodka@vodka-PC:~/programming/Diplomcpp/000$ g++ main.cpp -o tutorial `pkg-config gtkmm-3.0 --cflags --libs pkg-config gtkmm-3.0 --libs` -rdynamic

Пойду изучать этот CODE::BLOCK.

iljuase ★★★
() автор топика
Ответ на: РЕШЕНО!!! от iljuase

Linker

Да, в Linker надо.

Таже заменил вот так: extern «C» void cpupress (GtkButton *button, GtkLabel *label)

iljuase ★★★
() автор топика

Зачем тебе GTKmm и тег C++, если ты не пишешь на C++?

O02eg ★★★★★
()
Ответ на: комментарий от EXL

Привет, Хабр!

Там тебя с твоим GTK-хелловорлдом никто не ждёт.

это оттуда говнопример.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.