osg 刚开始学的一些问题。
这两天开始学习osg,按照一些教程,安装和配置成功之后,准备编个例子试试,出现了一些问题,仅此记录而已,以待以后再具体分析。
安装和配置教程 请按此按钮。
1、
1 #include <osgViewer/Viewer>
2
3 #include <osgDB/ReadFile>
4
5 int main( int, char** )
6
7 {
8
9 osgViewer::Viewer viewer;
10
11 viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
12
13 return viewer.run();
14
15 }
运行成功,没问题。出现一个小牛。
2、
1 #include <osgViewer/Viewer>
2 #include <osgDB/ReadFile>
3 int main()
4 {
5 osgViewer::Viewer viewer;
6 osg::Node *node =new osg::Node;
7 node = osgDB::readNodeFile("fountain.osg");
8 viewer.setSceneData(node);
9 return viewer.run();
10
11
12 }
error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall osg::Object::setName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?setName@Object@osg@@UAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
一般出现这种情况的原因是,没有添加相关的库文件,我检查了一下,此程序的能调动的相关库已经添加完毕,如下:
osgViewerd.lib
osgDBd.lib
osgd.lib
OpenThreadsd.lib
osgGAd.lib,可以说是只多不少。再看(初学者),
下面的程序,是通过添加一个节点,然后添加到场景中去的,是不是node的方法不对?
osg::Node *node =new osg::Node;
node = osgDB::readNodeFile("fountain.osg");
查相关资料是对的,相关api有
readNodeFile的定义 可以直接添加readNodeFile。 inline osg::Node* readNodeFile(const std::string& filename)
{
return readNodeFile(filename,Registry::instance()->getOptions());
}
通过以上得到:可能是node new的问题?
osg::Node *node =new osg::Node;
改之,直接用智能指针。
1 #include <osgViewer/Viewer>
2 #include <osgDB/ReadFile>
3 int main()
4 {
5 osgViewer::Viewer viewer;
6 osg::ref_ptr<osg::Node> node =new osg::Node;
7 node = osgDB::readNodeFile("fountain.osg");
8 viewer.setSceneData(node);
9 return viewer.run();
10
11
12 }
还是出现以上错误。555!
难道不能new?
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
int main()
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("fountain.osg");
node = osgDB::readNodeFile("fountain.osg");
viewer.setSceneData(node);
return viewer.run();
}
编译成功,正常运行。不明白为什么?
把智能指针换回去。如下:
1 #include <osgViewer/Viewer>
2 #include <osgDB/ReadFile>
3 int main()
4 {
5 osgViewer::Viewer viewer;
6 osg::Node * node = osgDB::readNodeFile("fountain.osg");
7 viewer.setSceneData(node);
8 return viewer.run();
9
10
11 }
编译通过,生成新实例。这到底是为什么?为什么?难道指针不能new 了?不能分配内存了?还是我的工程配置问题?
然后让同学试我的例子,正常运行。苍天啊,大地啊?why?
看到博文的童鞋,能解决我这个问题的,请给我站内信,万分感谢。
ps:osg2.8+VS2008+xp系统
本文版权归作者 kanego 和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.