Что может быть не так: GLib-GObject-WARNING **: невозможно зарегистрировать существующий тип PangoCairoFont.

Я потратил много недель, пытаясь получить gtk+ 3.22 для сборки на Visual Studio 2015. В конце концов я собрал его, но небольшая программа с графическим интерфейсом не смогла инициализировать gtk. Ошибка показана ниже:

gtk+_gtk_test.exe:15980): Gtk-WARNING **: Could not find the icon 'window-minimize-symbolic-ltr'. The 'hicolor' theme
was not found either, perhaps you need to install it.
You can get a copy from:
        http://icon-theme.freedesktop.org/releases

(gtk+_gtk_test.exe:15980): GLib-GObject-WARNING **: cannot register existing type 'PangoCairoFont'

(gtk+_gtk_test.exe:15980): GLib-GObject-CRITICAL **: g_type_interface_add_prerequisite: assertion 'G_TYPE_IS_INTERFACE (interface_type)' failed

(gtk+_gtk_test.exe:15980): Glib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed

Первое предупреждение возникает из-за того, что исполняемый файл не может найти файлы значков. Я уже придумал, как это исправить. Однако я не могу исправить второе предупреждение. Это мой первый проект gtk+. Когда я отлаживаю код, кажется, что тип PangoCairoFont не удался из-за существования типа PangoCairoWin32Font.

Что здесь может быть не так? Ценю ваш совет.

Исходный код программы:

#include <gtk/gtk.h>

void hello(GtkWidget *widget, gpointer data)
{
    g_print("Hello, World\n");
}

gint delete_event(GtkWidget *widget, GdkEvent event, gpointer data)
{
    /* when this fucntion returns FALSE, the delete-event 
       signal becomes a destroy signal*/
    return FALSE;
}

void end_program(GtkWidget *widget, gpointer data)
{
    /* End the main loop */
    gtk_main_quit();
}

int main(int argc, char **argv)
{
    GtkWindow *window;
    GtkButton *button;

    /* initialize Gtk+ */
    gtk_init(&argc, &argv);

    /* create window, set default height and width to 200px */
    window = g_object_new(GTK_TYPE_WINDOW,
        "default-height", 200,
        "default-width", 200,
        "border-width", 12,
        "title", "GtkHello",
        NULL);

    /* add signal handlers for window */
    g_signal_connect(window, "delete-event", G_CALLBACK(delete_event),
        NULL);

    g_signal_connect(window,
        "destroy", G_CALLBACK(end_program),
        NULL);

    /* create button */
    button = g_object_new(GTK_TYPE_BUTTON,
        "label", "_Hello, World!\nClick here.",
        "use-underline", TRUE,
        NULL);

    g_signal_connect(button,
        "clicked", G_CALLBACK(hello),
        NULL);

    g_signal_connect_swapped(button,
        "clicked", G_CALLBACK(gtk_widget_destroy),
        window);

    gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(button));

    gtk_widget_show_all(GTK_WIDGET(window));

    /* start main loop */
    gtk_main();

    return 0;
}

person cuteCAT    schedule 12.09.2017    source источник
comment
Не могли бы вы предоставить код вашей программы?   -  person pan-mroku    schedule 13.09.2017


Ответы (1)


Я понял. Я по ошибке встроил модуль pangocairo в статическую библиотеку вместо DLL. Эта библиотека дополнительно связана с разными DLL, поэтому глобальная переменная имеет несколько копий, что и вызвало проблему.

person cuteCAT    schedule 13.09.2017
comment
В моем проекте я создаю исполняемый модуль, затем использую тот же код для создания общего модуля (DLL/так) в качестве общей библиотеки, плагин зависит от общей библиотеки, при загрузке плагина вылетает ошибка (в памяти , есть две копии классов). - person Andy Tao; 08.07.2020