2017-02-12 9 views
2

私が望むのは、処理するファイルを選択するための単なるダイアログです。 私はしばらくの間Cランを使用していませんでした。いい例が見つかりません。単純な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にセグメンテーションフォールトが生じています)

たぶん、straceのが役立ちます:

http://pastebin.com/TdC0A2J3

+0

この問題は再現しています。 –

答えて

1

gtk_initの前に他のGTK機能)、またはapplication classを持ってg_application_runに電話する必要があります。 mainは通常どおりint main(int argc, char**argv)になります。

次のプログラムは、

}

#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; 

する(Linux/Debianの/シドに、GTKは3.22.7で)、ダイアログを表示していセグメンテーションフォールトしません。デバッグ時にgdbデバッガを使用して、

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

をコンパイルしてください。

+0

///おそらく望みます:gtk_main(); ??? – ProNOOB

+0

はい、実際のGTKアプリケーションでは、イベントループに 'gtk_main'があります。 –

+0

' gtk_native_dialog_run() 'と' gtk_dialog_run() 'にはそれぞれgtk_main()があります。その結果、 'gtk_main_quit()'は最も内側の 'gtk_main()'を終了するだけです。 – andlabs

関連する問題