查看: 3640|回复: 18

编译错误

[复制链接]

该用户从未签到

发表于 2008-8-11 22:24:29 | 显示全部楼层 |阅读模式
osg::ref_ptr<Geode> geode=new osg::Geode;
总是通不过编译,提示Geode为未标明的标识符;

osg::ref_ptr<osg::Geode> geode=new osg::Geode;
可以通过编译,但是总是提示程序正常初始化失败

该用户从未签到

 楼主| 发表于 2008-8-11 22:34:24 | 显示全部楼层
添加了

该用户从未签到

发表于 2008-8-11 22:35:07 | 显示全部楼层
osg::ref_ptr<Geode> geode=new osg::Geode;


这句明显就是语法错误~~~~初始化失败的原因很多,,,,你把代码都贴上来看看~~~~

该用户从未签到

 楼主| 发表于 2008-8-11 22:40:46 | 显示全部楼层
#include<Geode>
#include<Group>
#include<ref_ptr>


void main()
{
        osg::ref_ptr<Geode> geode=new osg::Geode;
}

额……那句话是书上写的……

该用户从未签到

发表于 2008-8-11 22:53:33 | 显示全部楼层

哪本书上有如此代码呀???既然使用了名字空间就没有必要再加了,,,,太乱了~~~~~

该用户从未签到

 楼主| 发表于 2008-8-11 22:59:39 | 显示全部楼层
《OpenSceneGraph_Quick_Start_Guide》中第40页……

该用户从未签到

发表于 2008-8-11 23:06:33 | 显示全部楼层
如果不太习惯在Geode,Node等类的前面加上“osg::”的话,可以在#include之后添加
using namespace osg
不过建议统一使用osg::Geode,osg::Node这样的格式,可以避免与其它库产生命名的冲突。

osg::ref_ptr<Geode> geode=new osg::Geode;
如果没有使用using namespace的话,恐怕这就是语法错误,因为在osg命名空间之外找不到名为Geode的类,应该为:
osg::ref_ptr<osg::Geode> geode=new osg::Geode;
至于是哪本书里的这并不重要,可能只是原作者的笔误而已。

您的程序倘若通过了编译,但运行出错,那么与这一行应该没有直接关系

[ 本帖最后由 array 于 2008-8-11 23:08 编辑 ]

该用户从未签到

 楼主| 发表于 2008-8-11 23:22:38 | 显示全部楼层
#include<Geode>
#include<Group>
#include<ref_ptr>

void main()
{
        osg::ref_ptr<osg::Geode> geode=new osg::Geode;
}
这个程序为什么会提示初始化失败呢?

该用户从未签到

 楼主| 发表于 2008-8-11 23:57:01 | 显示全部楼层
osg::ref_ptr<osg::Group> top = new osg::Group;
top->addChild(new osg::Geode);

第二句话是新建了一个Geode节点呢,还是只是把Geode节点的引用计数置1?

该用户从未签到

发表于 2008-8-12 08:45:51 | 显示全部楼层
原帖由 凌静轩 于 2008-8-11 23:22 发表
#include
#include
#include

void main()
{
osg::ref_ptr<osg::Geode> geode=new osg::Geode;
}
这个程序为什么会提示初始化失败呢?


您的测试程序中只有这一句吗?
这个main函数的格式好像不符合规范,您用的是什么编译器呢?

[ 本帖最后由 array 于 2008-8-12 08:49 编辑 ]

该用户从未签到

发表于 2008-8-12 08:48:52 | 显示全部楼层
原帖由 凌静轩 于 2008-8-11 23:57 发表
osg::ref_ptr<osg::Group> top = new osg::Group;
top->addChild(new osg::Geode);

第二句话是新建了一个Geode节点呢,还是只是把Geode节点的引用计数置1?


addChild的工作除了向top节点添加了一个子节点之外,如果这个子节点使用了ref_ptr智能指针,那么将该子节点的引用计数加1
但是这里addChild(new osg::Geode)一句中,子节点没有使用ref_ptr,而仅仅是一个新分配的普通内存指针,所以也就不涉及引用计数的问题

[ 本帖最后由 array 于 2008-8-12 08:50 编辑 ]

该用户从未签到

 楼主| 发表于 2008-8-12 10:29:47 | 显示全部楼层
您的测试程序中只有这一句吗?
这个main函数的格式好像不符合规范,您用的是什么编译器呢?


用的.net2003

该用户从未签到

发表于 2008-8-12 11:03:39 | 显示全部楼层
检查一下是否开启了VisualStudio的动态类型转换(/GR参数),在编译器选项的命令行直接加上/GR就可以了。没有开启的话,您在编译的时候应该会看到很多警告信息(/GR-之类的),程序可以编译通过但并不正确。

还有建议您严格遵循C++的标准来编写程序,类同void main()之类的书写方式在别的编译器下是通不过的

该用户从未签到

 楼主| 发表于 2008-8-12 11:46:19 | 显示全部楼层
恩,那个加好了,但是依然提示初始化失败,这是调试信息:
“aaa.exe”: 已加载“E:\Document\Visual Studio Projects\aaa\Debug\aaa.exe”,已加载符号。
“aaa.exe”: 已加载“C:\WINDOWS\system32\ntdll.dll”,未加载任何符号。
“aaa.exe”: 已加载“C:\WINDOWS\system32\kernel32.dll”,未加载任何符号。
“aaa.exe”: 已加载“D:\Program\OpenSceneGraph\bin\osg35-osgd.dll”,未加载任何符号。
LDR: LdrpWalkImportDescriptor() failed to probe D:\Program\OpenSceneGraph\bin\osg35-osgd.dll for its manifest, ntstatus 0xc0150002
调试器:: 在进程加载过程中引发了未处理的无法继续的异常
程序“[2904] aaa.exe: 本机”已退出,返回值为 -1072365566 (0xc0150002)。

该用户从未签到

发表于 2008-8-12 14:15:21 | 显示全部楼层
原帖由 凌静轩 于 2008-8-12 11:46 发表
恩,那个加好了,但是依然提示初始化失败,这是调试信息:
“aaa.exe”: 已加载“E:\Document\Visual Studio Projects\aaa\Debug\aaa.exe”,已加载符号。
“aaa.exe”: 已加载“C:\WINDOWS\system32\ntdll.dll”, ...


您的OSG是如何得到的?是使用同一个编译器编译源代码生成OSG的DLL和LIB文件吗?还是下载的已经编译好的版本?
目前论坛和官方提供的直接安装的OSG版本好像是基于VS2005或VS2008的,恐怕不可以直接用在VS2003上;最好的方法是自己从源代码开始,重新编译OSG,以制作可用的版本

该用户从未签到

 楼主| 发表于 2008-8-12 21:30:58 | 显示全部楼层
自己编译总是出问题所以就直接用的安装包,我还是再试试吧,谢谢您了~

osg::ref_ptr<osg::Group> top = new osg::Group;
top->addChild(new osg::Geode);

这两句话,书上是这么写的:addChild()使得Geode节点的引用计数置1……
这样新建的Geode节点以后怎么调用啊?连个名都没有……

该用户从未签到

发表于 2008-8-12 23:03:55 | 显示全部楼层
原帖由 凌静轩 于 2008-8-12 21:30 发表
自己编译总是出问题所以就直接用的安装包,我还是再试试吧,谢谢您了~

osg::ref_ptr top = new osg::Group;
top->addChild(new osg::Geode);

这两句话,书上是这么写的:addChild()使得Geode节点的引用计数置 ...


用不用ref_ptr,这其实只是个人的习惯;当然还是建议尽量使用智能指针,可以基本避免内存泄露和野指针的问题。
书里的话也不是权威,“尽信书不如无书”,它充其量只是用来参考的工具而已。您自己学习和创造所得的东西,永远是高于一切的~~

该用户从未签到

 楼主| 发表于 2008-8-14 11:06:23 | 显示全部楼层
恩,谢谢,我要继续看了,发现什么问题再来麻烦您~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表