我正在使用C ++和wxWidgets编写一个小游戏:
我收到以下运行时错误:
(process:14421): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.34.1/./gobject /gtype.c:2720: You forgot to call g_type_init()
(process:14421): GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
(process:14421): Gdk-CRITICAL **: IA__gdk_cursor_new_for_display: assertion `GDK_IS_DISPLAY (display)' failed
(process:14421): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.34.1/./gobject/gtype.c:2720: You forgot to call g_type_init()
(process:14421): GLib-CRITICAL **: g_once_init_leave: assertion `result != 0' failed
(process:14421): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.34.1/./gobject/gtype.c:2720: You forgot to call g_type_init()
(process:14421): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.34.1/./gobject/gtype.c:2720: You forgot to call g_type_init()
(process:14421): GLib-GObject-CRITICAL **: /build/buildd/glib2.0-2.34.1/./gobject/gtype.c:2720: You forgot to call g_type_init()
(process:14421): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion `G_TYPE_IS_INSTANTIATABLE (instance_type)' failed
我做了一些研究,但我不理解:
更重要的是:
修改 附加代码:
#include "../GUI/gui.h"
int main()
{
wxWindow myParent;
Spielfenster meinFenster(&myParent);
return 0;
}
GUI header-file:
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Dec 21 2009)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __gui__
#define __gui__
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/sizer.h>
#include <wx/frame.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class Spielfenster
///////////////////////////////////////////////////////////////////////////////
class Spielfenster : public wxFrame
{
private:
protected:
wxStaticText* m_staticText6;
wxStaticText* m_staticText7;
wxStaticText* m_staticText8;
wxStaticText* m_staticText9;
wxStaticText* m_staticText10;
public:
Spielfenster( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Feuerwerk"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 600,400 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
~Spielfenster();
};
#endif //__gui__
GUI cpp-file:
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Dec 21 2009)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "gui.h"
///////////////////////////////////////////////////////////////////////////
Spielfenster::Spielfenster( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxVERTICAL );
wxGridSizer* gSizer3;
gSizer3 = new wxGridSizer( 1, 5, 0, 0 );
m_staticText6 = new wxStaticText( this, wxID_ANY, wxT("HandCard1"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText6->Wrap( -1 );
gSizer3->Add( m_staticText6, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
m_staticText7 = new wxStaticText( this, wxID_ANY, wxT("HandCard2"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText7->Wrap( -1 );
gSizer3->Add( m_staticText7, 0, wxEXPAND, 5 );
m_staticText8 = new wxStaticText( this, wxID_ANY, wxT("HandCard3"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText8->Wrap( -1 );
gSizer3->Add( m_staticText8, 0, wxEXPAND, 5 );
m_staticText9 = new wxStaticText( this, wxID_ANY, wxT("HandCard4"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText9->Wrap( -1 );
gSizer3->Add( m_staticText9, 0, wxEXPAND, 5 );
m_staticText10 = new wxStaticText( this, wxID_ANY, wxT("HandCard5"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText10->Wrap( -1 );
gSizer3->Add( m_staticText10, 0, wxEXPAND, 5 );
bSizer2->Add( gSizer3, 1, wxEXPAND, 5 );
this->SetSizer( bSizer2 );
this->Layout();
}
Spielfenster::~Spielfenster()
编译器调用:
g++ -D_LARGE_FILES -D__WXGTK__ -I/usr/include/wx-2.8 -I/usr/include/wx-2.8/wx/gtk -I/usr/lib/x86_64-linux-gnu/wx/include/gtk2-unicode-release-2.8 -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++11 -pthread -MMD -MP -MF"gui.d" -MT"gui.d" -o "gui.o" "/home/michael/workspace/GUI/gui.cpp"
链接器呼叫:
g++ -L/usr/lib/x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -pthread -L/usr/lib/wxformbuilder -o "Fireworks" ./card.o ./game.o ./gui.o ./hello.o ./set.o ./stack.o -lwx_gtk2u_richtext-2.8 -lwx_gtk2u_aui-2.8 -lwx_gtk2u_xrc-2.8 -lwx_gtk2u_qa-2.8 -lwx_gtk2u_html-2.8 -lwx_gtk2u_adv-2.8 -lwx_gtk2u_core-2.8 -lwx_baseu_xml-2.8 -lwx_baseu_net-2.8 -lwx_baseu-2.8
我发现奇怪的是,Eclipse仍然在gui.h和gui.cpp中给我错误,比如“类型'wxStaticText'无法解决”但是编译......这可能是一个提示吗?
EDIT2 如果我这样做的话,那就是这个网站的“helloworld方式”:http://www.wxwidgets.org/docs/tutorials/hworld.txt 然后我没有得到g_type_init()作为建议的错误。不知道(还)真正的区别是什么。
答案 0 :(得分:1)
这不是缺少标题或库的问题,而是某个地方的错误。如果你没有直接使用GTK + / Glib,它必须是一个wxWidgets错误,但我不知道怎么会发生这种情况,所以需要一些更多的信息来了解正在发生的事情:要么是一个简单的小例子再现问题,要么至少在给出错误消息时来自gdb的回溯(获取它,在gdb下运行你的程序并在g_log
上放置一个断点,然后在命中时执行bt
)。
答案 1 :(得分:0)
解决这个问题和这个stackoverflow帖子-不是在使用wxWidgets时,而是在创建自定义复合GTK小部件并将其在测试程序中实例化时。
查看gtype.c的来源
AArch32
当类型系统未初始化时,它表示这样。
就我而言,我是在main中调用gtk_init之前创建了一个新的自定义小部件。
将自定义窗口小部件的创建移至 之后,对 124 #define g_return_val_if_type_system_uninitialized(return_value) G_STMT_START{ \
125 if (G_UNLIKELY (!static_quark_type_flags)) \
126 { \
127 g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \
128 "%s: You forgot to call g_type_init()", \
129 G_STRLOC); \
130 return (return_value); \
131 } \
132 }G_STMT_END
的调用解决了该问题。