2011-10-24 2 views
1

내 gtkmm 프로그램은 어떤 윈도우도 표시하지 않습니다. 컴파일이 잘 작동합니다. 다음은 실행할 때 내가 얻는 메시지입니다 :glade 파일의 gtkmm 빌더가 작동하지 않습니다.

(process:2312): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.24.1/gobject  
/gtype.c:2706: You forgot to call g_type_init() 
(process:2312): GLib-CRITICAL **: g_once_init_leave: assertion 
`initialization_value != 0' failed 
(process:2312): GLib-GObject-CRITICAL **: g_object_newv: assertion 
`G_TYPE_IS_OBJECT (object_type)' failed 

코드는 다음과 같습니다 basic.glade가 유효한 파일 또는 존재하지 않는 경우

int main(int argc, char** argv) { 
    Glib::RefPtr<Gtk::Builder> builder = 
     Gtk::Builder::create_from_file("basic.glade"); 
    Gtk::Window* pMyWindow = 0; 
    builder->get_widget("window1", pMyWindow); 
    pMyWindow->show(); 
} 

그것은 중요하지 않습니다. 나는 basic.glade 대신 전체 경로 파일을 시도했다.
디버깅 할 때 프로그램이 해당 빌더 첫 번째 줄에서 벗어나지 않는다는 것을 알고 있습니다. 그것은 계속 실행되는 것처럼 보이므로 유일한 프로세스를 일시 중지하면 g_once_init_enter_impl() 또는 g_slist_find() (이전에 호출 됨)에 있습니다. (그것은 결코 pMyWindow->show() 라인에 도달하지 않기 때문에) 그래서 지금

+0

빠른 질문, 메인 (메인 메모리에서 윈도우를 완전히 파괴해야합니까? – Matthew

답변

3

main에서 첫 번째 행으로 다음 줄을 추가 모든 창을 볼 수 없습니다 :

Gtk::Main kit(argc, argv); 

Gtkmm Hello World tutorial에 따르면

먼저 우리는 kit라는 객체를 인스턴스화합니다. 이것은 Gtk :: Main 유형입니다. 모든 gtkmm 프로그램에는이 중 하나가 있어야합니다.

이 개체는 오류에 대해 이야기하는 g_type_init 함수에 대한 호출을 포함하여 모든 GTK + 라이브러리를 초기화하는 작업을 담당합니다.

물론 kit 대신 원하는 이름을 사용할 수 있습니다.

UPDATE :

kit.run(); 

이 같은 친절하게 코멘트에 Erandros에 의해 언급 :

Gtk::Main::run(); 

또는 동등 :에 아, 그리고 당신이 호출해야합니다. 그것 없이는 프로그램은 immediatley를 끝낼 것입니다. 메인 루프를 실행하는 gtk_main() 호출이 발행됩니다.

+0

GUI를 실행하려면'kit.run()'을 추가하여 올바른 것으로 표시하십시오. – Erandros

관련 문제