查看: 5078|回复: 16

编译VPB的时候出现链接错误

[复制链接]

该用户从未签到

发表于 2010-9-14 20:09:39 | 显示全部楼层 |阅读模式
编译环境:VC2010,OSG svn 11750,VPB svn 1018,CMake 2.8.1

2>osgDBd.lib(osgDBd.dll) : error LNK2005: "public: void __thiscall std::basic_ofstream<char,struct std::char_traits<char> >::`vbase destructor'(void)" ([email=??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ]??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ[/email]) 已经在 SpatialProperties.obj 中定义
2>     正在创建库 D:/OSG/VPB/Build/lib/Debug/vpbd.lib 和对象 D:/OSG/VPB/Build/lib/Debug/vpbd.exp
2>D:\OSG\VPB\Build\lib\Debug\vpbd.dll : fatal error LNK1169: 找到一个或多个多重定义的符号

出现上述问题如何解决啊?在网上搜了一下,说是可以加上/force参数,试了一下是可以生成dll文件,但在运行VPB自带的几个程序都会报错。

该用户从未签到

发表于 2010-9-15 08:38:19 | 显示全部楼层
我不认为网上的方法是正确的,不知道您是如何生成vpb的?您的cmake参数是如何配置的

该用户从未签到

 楼主| 发表于 2010-9-15 20:06:34 | 显示全部楼层
以下是我CMake中的设置,谢谢!
VPB1.jpg
VPB2.jpg
VPB3.jpg

该用户从未签到

 楼主| 发表于 2010-9-15 20:08:46 | 显示全部楼层
另:OSG_GEN_INCLUDE_DIR 这一项我设成OSG安装目录“D:/OpenSceneGraph/include”也不行。

该用户从未签到

发表于 2010-9-16 08:38:21 | 显示全部楼层
您是否是在一个全新的目录下进行编译呢?VS有时候进行增量编译会出现问题

该用户从未签到

 楼主| 发表于 2010-9-18 00:28:43 | 显示全部楼层
是全新编译的,原来OSG用的是SVN 11722编译后再编译VPB svn 1017,后来又重新下载并编译的 OSG svn 11750 和 VPB svn 1018,还是在两台机器(一台是Win7,另一台是WinXP)上都编译了,都是这样的错误。
第三方库都是自己参考OSG官方提供的库(osgVisual),在VC 2010下编译的。

该用户从未签到

发表于 2010-9-20 08:27:13 | 显示全部楼层
也许您需要给出自己的一些工作过程,因为我这里是完全顺利地通过编译的;此外我不知道osgVisual是什么

该用户从未签到

 楼主| 发表于 2010-9-21 07:05:34 | 显示全部楼层
osgvisual:
http://www.osgvisual.org/projects/osgvisual/wiki/WikiStart
基于osg,主要做科学可视化和载具仿真的,还包括大气、天气、日照等特效,看来很强大,还没研究过。不过osg官网发布的第三方库就来自于osgvisual,在osgvisual官网还有第三方库源码包,里面还包含大部分第三方库的编译方法和说明。我就是用osgvisual第三方库源码包,参照其说明,在vc2010下编译的osg第三方库。

该用户从未签到

 楼主| 发表于 2010-9-21 07:13:12 | 显示全部楼层
我是在vc2010下编译的,工作过程是:
1、编译第三方库;
2、用cmake生成osg vc2010工程,并在vc2010下编译;
3、用cmake生成vpb工程,并在vc2010下编译。

用cmake生成工程时尽量使用默认设置,只是配置各种库的路径。
难道是vc2010的问题?

该用户从未签到

发表于 2010-9-21 10:26:33 | 显示全部楼层
您可以尝试用2008编译看看,如果没有问题,那么不排除是2010的STL库有需要进行改动的地方

该用户从未签到

 楼主| 发表于 2010-9-22 07:18:59 | 显示全部楼层
看来真的是VC2010的问题,用VC2008编译的确没有问题!

还有没有办法解决VPB在VC2010下的链接问题啊?

该用户从未签到

 楼主| 发表于 2010-9-22 23:02:45 | 显示全部楼层
刚刚试了下用 VC2010 编译带 /FORCE:MULTIPLE 参数,提示如下:

osgDB.lib(osgDB.dll) : warning LNK4006: "public: void __thiscall std::basic_ofstream<char,struct std::char_traits<char> >::`vbase destructor'(void)" ([email=??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ]??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ[/email]) 已在 SpatialProperties.obj 中定义;已忽略第二个定义
     正在创建库 D:/OSG/VPB/build/lib/Release/vpb.lib 和对象 D:/OSG/VPB/build/lib/Release/vpb.exp
D:\OSG\VPB\build\lib\Release\vpb.dll : warning LNK4088: 因 /FORCE 选项生成了映像;映像可能不能运行
  vpb.vcxproj -> D:\OSG\VPB\build\lib\Release\vpb.dll
FinalizeBuildStatus:
  正在删除文件“vpb.dir\Release\vpb.unsuccessfulbuild”。
  正在对“vpb.dir\Release\vpb.lastbuildstate”执行 Touch 任务。
生成成功。

看样子是应该是忽略了osgDB中的定义重名,这下子VPB自带的几个例子似乎都能正常运行了,试了下肖鹏的例子,用osgdem生成地形正常,可是生成那个地球的时候,只有半个地球。
VPB.png

该用户从未签到

 楼主| 发表于 2010-9-23 08:33:10 | 显示全部楼层
只有半个地球的问题,用VC2008编译的VPB也是这样,看来不是VC2010编译的问题。

该用户从未签到

 楼主| 发表于 2010-9-25 19:38:39 | 显示全部楼层
半个地球的问题已解决,用osgdem生成地球的时候,要自己输入命令行再执行,生成的地球就是整个的。

该用户从未签到

发表于 2010-10-5 10:43:15 | 显示全部楼层
编译vpb时只生成了.lib没生成.dll
链接是发生错误 没法生成osgdem.exe
如何解决

该用户从未签到

发表于 2012-12-9 16:08:54 | 显示全部楼层
x_wp 发表于 2010-9-15 20:08
另:OSG_GEN_INCLUDE_DIR 这一项我设成OSG安装目录“D:/OpenSceneGraph/include”也不行。

我的设置了也是不行,不知道为什么

该用户从未签到

发表于 2014-2-27 11:33:12 | 显示全部楼层
很好的啊,谢谢露珠的发那些啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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