查看: 3807|回复: 4

OSG最简单例程运行报错,error LNK2001: 无法解析的外部符号,请高人指教

[复制链接]

该用户从未签到

发表于 2012-5-22 16:56:47 | 显示全部楼层 |阅读模式
我下的最新的OpenSceneGraph-3.0.1.zip,按照 http://www.cnblogs.com/eaglezhao ... 7/12/eaglezhao.html 方法在我的电脑上测试,环境:台式机,win7 x64旗舰版,VS2010,在批生成库文件时,我用的是x64平台,因为我也选不了win32,只有x64,如图:
123.jpg
其它没什么异常,配好环境变量,重启了电脑建了一个win32控制台程序,测试代码如下:
#include<osgViewer/Viewer>
#include<osgDB/ReadFile>

#ifdef _DEBUG
#pragma comment(lib,"OpenThreadsd.lib")
#pragma comment(lib,"osgAnimationd.lib")
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"osgUtild.lib")
#pragma comment(lib,"osgGAd.lib")
#pragma comment(lib,"osgFXd.lib")
#pragma comment(lib,"osgViewerd.lib")
#pragma comment(lib,"osgTextd.lib")
#else
#pragma comment(lib,"OpenThreads.lib")
#pragma comment(lib,"osgAnimation.lib")
#pragma comment(lib,"osg.lib")
#pragma comment(lib,"osgDB.lib")
#pragma comment(lib,"osgUtil.lib")
#pragma comment(lib,"osgGA.lib")
#pragma comment(lib,"osgFX.lib")
#pragma comment(lib,"osgViewer.lib")
#pragma comment(lib,"osgText.lib")
#endif // _DEBUG

int main( int argc, char **argv )
{
        osgViewer::Viewer viewer;
        viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
        return viewer.run();
}

这些是在网上找的,应该是别人运行正常的代码,在项目属性里 VC++ 目录 中我也加入了包含文件include、库文件lib文件夹,如图:
234.jpg
而我编译能成功,但运行时报错,在链接器的输入里加入附加依赖项也不行,错误信息如下:
1>------ 已启动生成: 项目: vsOSGTest, 配置: Release Win32 ------
1>生成启动时间为 2012/5/22 16:28:42。
1>InitializeBuildStatus:
1>  正在对“Release\vsOSGTest.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1>  test.cpp
1>test.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: virtual int __thiscall osgViewer::Viewer::run(void)" (__imp_?run@Viewer@osgViewer@@UAEHXZ)
1>test.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: virtual void __thiscall osgViewer::Viewer::setSceneData(class osg::Node *)" (__imp_?setSceneData@Viewer@osgViewer@@UAEXPAVNode@osg@@@Z)
1>test.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall osgViewer::Viewer::Viewer(void)" (__imp_??0Viewer@osgViewer@@QAE@XZ)
1>test.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) class osg::Node * __cdecl osgDB::readNodeFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class osgDB::Options

const *)" (__imp_?readNodeFile@osgDB@@YAPAVNode@osg@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PBVOptions@1@@Z)
1>test.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: static class osgDB::Registry * __cdecl osgDB::Registry::instance(bool)" (__imp_?instance@Registry@osgDB@@SAPAV12@_N@Z)
1>test.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: class osgDB::Options * __thiscall osgDB::Registry::getOptions(void)" (__imp_?getOptions@Registry@osgDB@@QAEPAVOptions@2@XZ)
1>test.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall osgViewer::Viewer::`vbase destructor'(void)" (__imp_??_DViewer@osgViewer@@QAEXXZ)
1>E:\vsProject\vsOSGTest\Release\vsOSGTest.exe : fatal error LNK1120: 7 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:10.28
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

是不是我用x64平台生成的库文件,在win32控制台应用程序中就是不能用吗?可是我生成库文件时,也选不了win32啊,我想请问高手,这是什么原因造成的,以及怎么解决,谢谢

该用户从未签到

发表于 2012-5-23 09:18:13 来自手机 | 显示全部楼层
在附加依赖库中加入你用到的库文件。

该用户从未签到

 楼主| 发表于 2012-5-23 09:56:41 | 显示全部楼层
其实不用添加附加依赖库,因为我代码中写了,原因找到了,在运行时,得选X64,Win32不行,看来只能做成64位的程序了

该用户从未签到

发表于 2012-7-11 20:11:15 | 显示全部楼层
我和作者遇到了相同问题,我们的安装环境(Win7 x64 Vs2010),Osg版本(3.0.1)一模一样,百度了几个小时,试了各种方法都找不到问题所在,直到看到作者的帖子,根据作者的回答,我将工程运行平台转变为x64,编译通过。(具体转换方式参考百度文库:“软件移植:从win32到x64”,我这是第一次遇到需要这样转换的问题)
虽然64位是大趋势,但是就目前来看,32依然是主流,而且Win32程序完全可以在64位机子上运行,但反过来就不一定了。所有我还是决定将从新编译Osg3.0.1,全部改为32位。(cMake中有选项涉及32位编译器还是64位编译器的选择)(想想,3-4小时编译一次,真想哭)
没想到Osg开发第一步就这么费劲,但还是得走下去。希望遇到同样问题的朋友,能看到此贴,节约宝贵时间。

该用户从未签到

发表于 2012-7-12 09:09:42 | 显示全部楼层
原来是操作系统的问题!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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