2017-02-12 11 views
2

Все, что я хочу, это просто простой диалог для выбора файла для обработки. Я не использовал C lang некоторое время, и я не могу найти хороший рабочий пример.Не удается получить простое приложение GTK3 для работы

код:

#include <gtk/gtk.h> 
#include <stdio.h> 

int main(int argc, char const *argv[]) { 

    GtkFileChooserNative *native; 

    native = gtk_file_chooser_native_new ("Open File", NULL, GTK_FILE_CHOOSER_ACTION_OPEN, NULL, NULL); 

    return 0; 
} 

я скомпилировать его с помощью этой команды:

gcc `pkg-config gtk+-3.0 --cflags` `pkg-config gtk+-3.0 --libs` -o out dialog.c 

Я имею ошибку сегментации на gtk_file_chooser_native_new()

Может Трассирование поможет:

http://pastebin.com/TdC0A2J3

+0

Я воспроизвожу эту проблему. –

ответ

1

Вам необходимо позвонить gtk_init (до любой другой функцией GTK), либо у вас есть свой application class и позвоните по телефону g_application_run. И ваш main должен быть int main(int argc, char**argv), как обычно.

Следующая программа не сегментации (на Linux/Debian/Sid, GTK является 3.22.7)

#include <gtk/gtk.h> 
#include <stdio.h> 
int main (int argc, char **argv) { 
    GtkFileChooserNative *native = NULL; 
    gtk_init (&argc, &argv); 
    native = gtk_file_chooser_native_new ("Open File", NULL, 
      GTK_FILE_CHOOSER_ACTION_OPEN, NULL, NULL); 
    guint res = gtk_native_dialog_run (GTK_NATIVE_DIALOG (native)); 
    if (res == GTK_RESPONSE_ACCEPT) { 
    char *filename; 
    GtkFileChooser *chooser = GTK_FILE_CHOOSER (native); 
    filename = gtk_file_chooser_get_filename (chooser); 
    printf ("should open %s\n", filename); 
    g_free (filename); 
    } 
    /// in a real application perhaps you want: gtk_main(); 
    return 0; 

}

и не отображает диалоговое окно. Компиляция, что с помощью

gcc -Wall -g $(pkg-config gtk+-3.0 --cflags) \ 
    $(pkg-config gtk+-3.0 --libs) \ 
    -o out dialog.c 

и использовать gdb отладчик при отладке.

+0

///, возможно, вы хотите: gtk_main(); ??? – ProNOOB

+0

Да, вообще-то, у реального приложения GTK есть цикл событий с 'gtk_main' –

+0

' gtk_native_dialog_run() 'и' gtk_dialog_run() 'все имеют свои собственные' gtk_main() 's в них. Как следствие, 'gtk_main_quit()' только завершает самую внутреннюю gtk_main() '. – andlabs