查看: 2310|回复: 8

请教静态编译OSG的问题

[复制链接]

该用户从未签到

发表于 2009-9-18 00:19:59 | 显示全部楼层 |阅读模式
请问静态编译OSG2.8.0应该怎么做?都要注意什么?是不是第三方库也需要是静态库?
希望版主可以详细介绍,不甚感激....

今天用VS2005尝试一下,只编译release版的,我是这样做的:

在CMake时关闭DYNAMIC_OPENSCENEGRAPH和DYNAMIC_OPENTHREADS选项;

编译前把项目属性-》配置类型为设成静态库;

运行时库由MD改为MT;

编译可以通过,完成后生成lib文件。

以为OK了,做了个小程序试了下,代码只有下面几句:
  1. #include <osgViewer/Viewer>
  2. #include <osgDB/ReadFile>



  3. int main(int argc, char** argv)
  4. {
  5.         osgViewer::Viewer* _viewer = new osgViewer::Viewer;

  6.         _viewer->setSceneData(osgDB::readNodeFile("cow.osg"));
  7.        
  8.         _viewer->run() ;

  9.         return 1;

  10. }
复制代码
编译时报上千个错误,全是无法解析的外部符号。。。不知是什么原因。

我在项目附加依赖项里 把osg生成的lib,以及一些第三方库的lib全加上都没用,希望哪位高人指点一下,谢了...

该用户从未签到

 楼主| 发表于 2009-9-18 00:22:00 | 显示全部楼层
不好意思,网络卡,以为没发成功,点了两次发送。。。。麻烦版主删掉一个吧.

该用户从未签到

发表于 2009-9-18 08:36:25 | 显示全部楼层
您出现的是什么错误?给出几个有代表性的吧

该用户从未签到

 楼主| 发表于 2009-9-18 11:09:16 | 显示全部楼层
本帖最后由 wxxx 于 2009-9-18 11:10 编辑

error LNK2019: 无法解析的外部符号 _memcpy_s,该符号在函数 "public: virtual void __thiscall osg::AlphaFunc::apply(class osg::State &)const " (?apply@AlphaFunc@osg@@UBEXAAVState@2@@Z) 中被引用        osg55-osg.lib       

error LNK2019: 无法解析的外部符号 _memmove_s,该符号在函数 "public: __thiscall std::bad_alloc::bad_alloc(char const *)" (??0bad_alloc@std@@QAE@PBD@Z) 中被引用        osg55-osg.lib       

error LNK2001: 无法解析的外部符号 "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z)        osg55-osg.lib       
error LNK2019: 无法解析的外部符号 "public: virtual char const * __thiscall std::exception::what(void)const " (?what@exception@std@@UBEPBDXZ),该符号在函数 "public: void __thiscall osg::Referenced::unref(void)const " (?unref@Referenced@osg@@QBEXXZ) 中被引用        osg55-osg.lib       

error LNK2019: 无法解析的外部符号 "void __cdecl operator delete(void *)" (??3@YAXPAX@Z),该符号在函数 "public: static char * __cdecl std::char_traits<char>::_Copy_s(char *,unsigned int,char const *,unsigned int)" (?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z) 中被引用        osg55-osg.lib       

error LNK2019: 无法解析的外部符号 __fltused,该符号在函数 "public: virtual void * __thiscall std::bad_alloc::`scalar deleting destructor'(unsigned int)" (??_Gbad_alloc@std@@UAEPAXI@Z) 中被引用        osg55-osg.lib

该用户从未签到

发表于 2009-9-18 11:54:22 | 显示全部楼层
相关动态库没有引用。

该用户从未签到

发表于 2009-9-18 12:12:46 | 显示全部楼层
msvcrt.lib之类的M$库没有引用

该用户从未签到

 楼主| 发表于 2009-9-18 12:49:57 | 显示全部楼层
本帖最后由 wxxx 于 2009-9-18 12:56 编辑

谢谢回复。
加上msvrt.lib可以编译成功,但运行时会有错:
View::setUpViewAcrossAllScreens() : Error, no WindowSystemInterface available, c
annot create windows.
Viewer::realize() - failed to set up any windows

加上这几句就可以了:
  1. USE_OSGPLUGIN(osg);
  2. USE_OSGPLUGIN(freetype);
  3. USE_GRAPHICSWINDOW();
复制代码
在官网上看到一篇讲静态链接的文章,07年的:http://www.openscenegraph.org/pr ... sks/Win32StaticLink

中文官网是:http://www.osgchina.org/projects ... Win32StaticLink.php

第6条说 使用函数级链接(function-level linking)需要 “Determine C++ mangled names of registration function in each required plugin”,挺复杂的...

请问版主osg2.8.0还需要这样做吗?

该用户从未签到

发表于 2009-9-18 13:31:00 | 显示全部楼层
USE_OSGPLUGIN(osg)
USE_GRAPHICSWINDOW()
这几句的确要加上,参看osgstaticviewer例子就可以了。那句话说的就是这个意思

该用户从未签到

 楼主| 发表于 2009-9-18 13:52:46 | 显示全部楼层
收到!谢谢array。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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