0%

VS2013环境下配置OSG(3.4.0版本)

  1. 参考资料
  2. 2022.9 VS2022编译3.6.5的注意事项
    1. ALL_BUILD时出现部分失败
    2. 缺少GLine等符号的定义
    3. osgDB::readNodeFile读取失败,异常:bad allocation
    4. Could not find plugin to read objects from file
  3. 前期准备
  4. 解压文件
  5. 处理源码
  6. 编译阶段
  7. 数据整理
  8. 环境变量设置与链接库
  9. 调试阶段

参考资料

参考了CSDN和OSG中国的文章:

VS2013的OSG开发环境配置_php_Yinglin的博客-CSDN博客

OSG+VS2010+win7环境搭建 - OSG教程学习 - OSG中国官方论坛-有您OSG在中国才更好 - Powered by Discuz!

2022.9 VS2022编译3.6.5的注意事项

OSG-OpenSceneGraph在WIN10与VS2022下的部署(OSG3.6.5+VS2022+Win10x64)个人笔记详细食月的博客-CSDN博客

ALL_BUILD时出现部分失败

如果失败的工程是Examples osgviewerMFC,则打开该工程,找到stdafx.h头文件,进行如下修改:

1
2
3
4
#ifndef WINVER
//#define WINVER 0x0501
#define WINVER 0x0A00
#endif

修改后再执行一次批生成ALL_BUILD即可

缺少GLine等符号的定义

image-20220916124812175

加上预处理器定义WIN32

image-20220916125042406

osgDB::readNodeFile读取失败,异常:bad allocation

Debug和Release的lib引入错误

Debug配置下应该引入*d.lib

image-20220916130427652

Release引入末尾不加d的.lib

Could not find plugin to read objects from file

缺少解析插件,解决方案:

  1. 拷贝目录build/bin/osgPlugins-3.6.5到exe目录下(目录名称必须是osgPlugins-3.6.5,改一个字符都用不了)
  2. 拷贝目录build/bin/osgPlugins-3.6.5到中所有dll到exe目录下
  3. 添加build/bin绝对路径到环境变量path

前期准备

OSG三件套:

CMake编译工具:cmake-3.9.1-win32-x86.msi

【注】可以前往Download | CMake下载最新版本的CMake安装包,根据自身的系统进行不同的选择:

无

安装时添加到系统变量path

在CMake的安装过程中部分杀毒软件会进行警告,点击允许即可。

解压文件

首先在某个地方创建一个文件夹(我直接在E盘上创建一个名为OSG的文件夹),用来存储数据,在这个文件夹内,创建3个子文件夹(3rdParty、data、OpenSceneGraph),分别存储3个压缩包中的内容,如图所示:

这里写图片描述

接着开始解压文件

  1. 打开OSG第三方库(3rdParty_VS2013_v120_x86_x64_V9_small.7z\3rdParty_x86_x64),根据自身的系统选择文件夹(有x86和x64两个),打开文件夹后全选里面所有的东西,解压到指定文件夹:${根目录}\OSG\3rdParty。需要说明的是,x86对应32位系统,x64对应64位系统 (不过在这里还是推荐选择x86,因为64位的隐患很大,很多库没有64位的,参考链接2里的那位楼主亲自试验过,在后面的VS批生成的时候导致ALL_INSTALL出现了2个失败,在后面的直接4个全失败。所以这里他建议选择使用32位的)
  2. 打开数据包(OpenSceneGraph-Data-3.4.0.zip\OpenSceneGraph-Data),全选所有内容解压到 ${根目录}\OSG\data
  3. 打开OSG源码(OpenSceneGraph-3.4.0.zip\OpenSceneGraph-3.4.0),全选所有内容解压到 ${根目录}\OSG\OpenSceneGraph。为了避免文件过于杂乱,建议在解压完文件后,在OpenSceneGraph文件夹中新建两个文件夹bin和build。

处理源码

打开CMake,目录 …\CMake\bin,里面的那个cmake-gui.exe就是(建议在桌面创建一个快捷方式方便打开)。

将OpenSceneGraph文件夹中的CMakeLists.txt拖到CMake中:

这里写图片描述

将Where to build the binaries后的目录地址改为刚刚创建的build文件夹:

这里写图片描述

接着点击下方的Configure按钮,在弹出的对话框中作如下选择:(为什么不选择VS2013??因为最新的CMake没有这个选项,不过我们用VS2012的方式也可以解决问题,具体措施查看文末

这里写图片描述

finish之后进行相关的设置:

  • ACTUAL_3RDPARTY_DIR:…/OSG/3rdParty;
  • BUILD_OSG_EXAMPLES:勾上
  • CMAKE_INSTALL_PREFIE:…/OSG/OpenSceneGraph/;

这里写图片描述

这里写图片描述

修改完参数的值后,再次点击Configure。完成后,将BUILD_MFC_EXAMPLE参数后面的√打上,又一次Configure(如果找不到这个参数,将上方的Advanced选上):

这里写图片描述

最后点击Generate,源码处理完毕。

编译阶段

用VS2013打开位于E:/OSG/OpenSceneGraph/build中的工程文件OpenSceneGraph.sln,这个好像是VS2012对应的解决方案文件,不过似乎没什么影响;在打开的过程中会弹出一个对话框问你要不要diable某个option,我不是很清楚就点了否。

打开【菜单栏】-【生成】-【批生成】,对ALL_BUILD进行生成(选择Debug和Release两种配置):

这里写图片描述

这段编译时间非常长,大致要3-5个小时(似乎和电脑的配置有关系?)

这里要插播一句,因为用的是面向VS2012的解决方案(sln),因此编译结束后输出栏中可能会有一大堆的警告和报错,不用管它。(具体解决措施见文末)

接着对INSTALL执行相同的操作,这部分生成时间较短,在10-20分钟左右。

这里写图片描述

数据整理

编译结束后,生成了大量的数据(估摸着有3个G),为了方便之后的使用,我们在另外的地方重新创建了一个OSG文件夹,里面包含了四个子文件夹:

这里写图片描述

填充这四个文件夹就成了下一步我们要做的事。

  • 将…\OSG\OpenSceneGraph下的bin,include,lib文件夹直接拷贝至新的OSG文件夹
  • 打开…\OSG\OpenSceneGraph\build,将里面的bin,include,lib文件夹也拷贝到新的OSG文件夹,期间系统弹出的任何关于合并、替换的提示(替换文件夹,替换xx文件等等),选择“合并”和“复制和替换”:

这里写图片描述

这里写图片描述

  • 最后,将…\OSG下的data文件夹整个拷贝到新的OSG文件夹。

环境变量设置与链接库

【我的电脑】-【属性】-【高级系统设置】-【高级】-【环境变量】在系统变量PATH后添加新的OSG文件夹中bin文件夹的目录,即在变量值后面用分号隔开写入新的OSG文件夹bin文件夹的目录:…\OSG\bin;

另外,手动在系统变量中添加变量OSG_FILE_PATH,并将变量值设置为新的OSG文件夹中data的位置,即 …\OSG\data

:win7系统中,环境变量的配置重启后生效,可以配置完毕后再重启。

这时候回到编译器VS2013,先创建一个一般工程用于测验,然后打开【菜单栏】-【项目】-【属性】-【配置属性】-【VC++目录】,在包含目录库目录中分别添加新的OSG文件夹中include和lib的位置:

这里写图片描述

以及,在【VC++目录】下两行的【链接器】-【输入】的附加依赖项中添加如下代码:

1
2
3
4
5
6
7
OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib

这里写图片描述

调试阶段

理论上讲,以上操作结束后,osg就可以在VS2013的环境下发挥作用了,这时候我们借助一些简单的代码来进行调试:

1
2
3
4
5
6
7
8
9
#include<osgViewer/Viewer>
#include<osgDB/ReadFile>

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

由于CMake中不存在VS2013的解决方案,我们之前使用的是VS2012的生成方法,并且在编译的时候也忽略了输出框中的一些警告和报错,因此难免会出点问题。

比如我在调试的时候编译器就提示我“缺少zlibd.dll文件”,而使用everything搜索了之后,发现(新)OSG/bin文件夹中并没有这个dll文件,只有原来的…\OSG\3rdParty\bin\中有一个,于是我将其中相关的3个文件拷贝到了新的文件夹:

这里写图片描述

问题解决,运行成功!类似地,缺少什么dll文件可以先在电脑中搜索一下,然后手动拷贝到新的bin文件夹里,应该不会有什么大问题。以下是例图:

这里写图片描述