求助 Anjuta + Gtkmm 的问题 已解决

软件和网站开发以及相关技术探讨
回复
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

求助 Anjuta + Gtkmm 的问题 已解决

#1

帖子 雪酷龙 » 2009-08-14 1:20

我的Ubuntu 9.04 系统

gtk_foobarwindow.hpp

代码: 全选

#ifndef _GTK_FOOBAR_WINDOW_HPP_
#define _GTK_FOOBAR_WINDOW_HPP_

#include <libglademm.h>
#include <gtkmm.h>

class gtk_foobarWindow : public Gtk::Window
{
public:
  gtk_foobarWindow(BaseObjectType* cobject,
                    const Glib::RefPtr<Gnome::Glade::Xml>& glade_xml);
  virtual ~gtk_foobarWindow();

protected:

};

#endif // _GTK_FOOBAR_WINDOW_HPP_
gtk_foobarwindow.cc

代码: 全选

#include "gtk_foobarwindow.hpp"

gtk_foobarWindow::gtk_foobarWindow(
  BaseObjectType* base_object,
  const Glib::RefPtr<Gnome::Glade::Xml>& glade_xml)
  : Gtk::Window(base_object)
{
}

gtk_foobarWindow::~gtk_foobarWindow()
{
}
main.cc

代码: 全选

#include <libglademm/xml.h>
#include <gtkmm.h>
#include <iostream>
#include "gtk_foobarwindow.hpp"


#ifdef ENABLE_NLS
#  include <libintl.h>
#endif


/* For testing propose use the local (not installed) glade file */
/* #define GLADE_FILE PACKAGE_DATA_DIR"/gtk_foobar/glade/gtk_foobar.glade" */
#define GLADE_FILE "gtk_foobar.glade"
   
int
main (int argc, char *argv[])
{
	Gtk::Main kit(argc, argv);
	
	//Load the Glade file and instiate its widgets:
	Glib::RefPtr<Gnome::Glade::Xml> refXml;
	try
	{
		refXml = Gnome::Glade::Xml::create(GLADE_FILE);
	}
	catch(const Gnome::Glade::XmlError& ex)
    {
		std::cerr << ex.what() << std::endl;
		return 1;
	}
	gtk_foobarWindow* main_win = 0;
	refXml->get_widget_derived("main_window",main_win);
	if (main_win)
	{
		kit.run(*main_win);
	}
	return 0;
}
Building in directory: /home/isotope/文档/Anjuta_Project/gtk-foobar/src
make
g++ -DHAVE_CONFIG_H -I. -I.. -DPACKAGE_LOCALE_DIR=\""/usr/local/share/locale"\" -DPACKAGE_SRC_DIR=\""."\" -DPACKAGE_DATA_DIR=\""/usr/local/share"\" -D_REENTRANT -I/usr/include/gtkmm-2.4 -I/usr/lib/gtkmm-2.4/include -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/giomm-2.4 -I/usr/lib/giomm-2.4/include -I/usr/include/gdkmm-2.4 -I/usr/lib/gdkmm-2.4/include -I/usr/include/pangomm-1.4 -I/usr/include/atkmm-1.6 -I/usr/include/gtk-2.0 -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/lib/gtk-2.0/include -I/usr/include/cairomm-1.0 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12 -I/usr/include/atk-1.0 -I/usr/include/libglademm-2.4 -I/usr/lib/libglademm-2.4/include -I/usr/include/libglade-2.0 -I/usr/include/libxml2 -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cc
mv -f .deps/main.Tpo .deps/main.Po
g++ -g -O2 -o gtk_foobar main.o -lglademm-2.4 -lgtkmm-2.4 -lglade-2.0 -lgiomm-2.4 -lgdkmm-2.4 -latkmm-1.6 -lpangomm-1.4 -lcairomm-1.0 -lglibmm-2.4 -lsigc-2.0 -lgtk-x11-2.0 -lxml2 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lgio-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0
main.o: In function `gtk_foobarWindow* Gnome::Glade::Xml::get_widget_derived<gtk_foobarWindow>(Glib::ustring const&, gtk_foobarWindow*&)':
/usr/include/libglademm-2.4/libglademm/xml.h:291: undefined reference to `typeinfo for gtk_foobarWindow'
/usr/include/libglademm-2.4/libglademm/xml.h:307: undefined reference to `gtk_foobarWindow::gtk_foobarWindow(_GtkWindow*, Glib::RefPtr<Gnome::Glade::Xml> const&)'
collect2: ld 返回 1
make: *** [gtk_foobar] 错误 1
已完成 ... 失败
总共耗时:0 秒
老是编译不过,不知道谁有同样的问题,学习GTKMM真有压力,资料少,有没有哪个致力学习这个东西,结伴同行!!
上次由 雪酷龙 在 2009-08-19 21:29,总共编辑 1 次。
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

Re: 求助 Anjuta + Gtkmm 的问题

#2

帖子 雪酷龙 » 2009-08-14 1:35

我自己刚刚做的Anjuta 的模板
附件
Anjuta_模板.tar.gz
解压路径/usr/share/anjuta/project
(3.58 KiB) 已下载 77 次
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

Re: 求助 Anjuta + Gtkmm 的问题

#3

帖子 雪酷龙 » 2009-08-14 12:13

这是我照GTKMM的例子做的,去年上半年先是可以的,后来anjuta升级了就不行了
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

Re: 求助 Anjuta + Gtkmm 的问题

#4

帖子 雪酷龙 » 2009-08-15 10:47

低级问题就没有人回复吗??我真的搞不明白我传入的重载类提示未定义??~这是照着官方例子做的重载类~~
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 求助 Anjuta + Gtkmm 的问题

#5

帖子 linjiework » 2009-08-15 13:19

不用 Anjuta 的飘过~~~

根据错误提示,应该是库没包含全。更多的我也帮不了了。
阿呆 : 天下第一呆!
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

Re: 求助 Anjuta + Gtkmm 的问题

#6

帖子 雪酷龙 » 2009-08-16 0:02

我照论坛里的教程安装了这些包
build-essential
gnome-devel
autogen
automake
build-essential
indent
intltool
libglademm-2.4-dev
libgnomemm-2.6-dev
intltool
头像
tipfoo
帖子: 303
注册时间: 2007-07-12 16:30
来自: 桂林

Re: 求助 Anjuta + Gtkmm 的问题

#7

帖子 tipfoo » 2009-08-18 17:58

将:

代码: 全选

refXml->get_widget_derived("main_window",main_win);
改成:

代码: 全选

ref_xml->get_widget("main_window", main_window);
试试看。
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

Re: 求助 Anjuta + Gtkmm 的问题

#8

帖子 雪酷龙 » 2009-08-19 0:57

真感谢你的回复,我早就试过了!
/usr/include/libglademm-2.4/libglademm/xml.h:246: undefined reference to `typeinfo for gtk_foobarWindow'
查找错误点是跳到了这段代码
T_Widget* get_widget(const Glib::ustring& name, T_Widget*& widget)
{
// The dynamic_cast<> should never fail if get_widget_checked() succeeded.
错误点 widget = dynamic_cast<T_Widget*>(this->get_widget_checked(name, T_Widget::get_base_type()));
而改成refXml->get_widget_derived("main_window",main_win);
template <class T_Widget> inline
T_Widget* get_widget_derived(const Glib::ustring& name, T_Widget*& widget)
{
// initialize input parameter
widget = 0;

// Get the widget from the glade file.
typedef typename T_Widget::BaseObjectType cwidget_type;
cwidget_type* pCWidget = (cwidget_type*)get_cwidget(name);

//The error was already reported by get_cwidget().
if(!pCWidget)
return 0;

//Check whether there is already a C++ wrapper instance associated with this C instance:
Glib::ObjectBase* pObjectBase = ObjectBase::_get_current_wrapper((GObject*)pCWidget);

//If there is already a C++ instance, then return it again:
if(pObjectBase)
{
这过不去 widget = dynamic_cast<T_Widget*>( Glib::wrap((GtkWidget*)pCWidget) );
//Newer, more spec-complaint, versions of g++ not resolve a specific wrap() function in a template.

//The dynamic cast checks that it is of the correct type.
//Somebody might be trying to call get_widget_derived() after already calling get_widget(),
//or after already calling get_widget_derived() with a different derived C++ type.
if(!widget)
g_critical("Gnome::Glade::Xml::get_widget_derived(): dynamic_cast<> failed. An existing C++ instance, of a different type, seems to exist.");
}
else
{
//Create a new C++ instance to wrap the existing C instance:

//Set the output variable. We needed to do this because we can not template the return type.
Glib::RefPtr<Gnome::Glade::Xml> refThis(this);
refThis->reference(); //take a copy.
还有这 widget = new T_Widget(pCWidget, refThis);
}

//We return it as well (we need the parameter as well, because C++ can not just template the return type.)
return widget;
}
头像
tipfoo
帖子: 303
注册时间: 2007-07-12 16:30
来自: 桂林

Re: 求助 Anjuta + Gtkmm 的问题

#9

帖子 tipfoo » 2009-08-19 2:15

g++ -DHAVE_CONFIG_H -I. -I.. -DPACK........... -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cc
................
................
g++ -g -O2 -o gtk_foobar main.o -lglademm-2.4 -lgtkmm-2.4 -lglade-2.0 .......
连“gtk_foobarwindow.cpp”都没加入要编译的列表中,只有 main.o,应该还有个貌似 gtk_foobarwindow.o 的东东才是(或将其并入main.o也行)。看看工程的 Makefile 文件的相关规则,再到生成 Makefile 的源文件中添加相应配置,好像记得 Makefile 文件开始的注释有说明是由谁生成它的。
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

Re: 求助 Anjuta + Gtkmm 的问题

#10

帖子 雪酷龙 » 2009-08-19 10:11

发现用Anjuta 添加类,无法加入工程,不过以前能加入的时候也是出这个问题~~
Can not add source files

gtkfoobar-window.h: 无法更新项目

Root directory doesn't look like the root of an automake package
gtkfoobar-window.cc: 无法更新项目

Root directory doesn't look like the root of an automake package
雪酷龙
帖子: 52
注册时间: 2007-03-12 20:23

Re: 求助 Anjuta + Gtkmm 的问题

#11

帖子 雪酷龙 » 2009-08-19 18:56

多谢提醒,,在Makefile.am里加入
gtk_foobar_SOURCES = \
main.cc \
gtk_foobarwindow.cc
就可以了,原来要引用一个头文件,不是光把它放在源代码目录,和加入#include 引入就可以用的,要在IDE加入~~我看编程语言没有这些东西的~~
头像
tipfoo
帖子: 303
注册时间: 2007-07-12 16:30
来自: 桂林

Re: 求助 Anjuta + Gtkmm 的问题 已解决

#12

帖子 tipfoo » 2009-08-20 1:27

唉,还是做 Anjuta 的人不够做 Netbeans 的那帮家伙,这两年 Anjuta 在软件质量方面一直没什么长进,还是问题多多、还时不时崩溃。真不知道 Netbeans 项目是谁领导的,软件工程管理得这么出色。
回复