OSG编译

准备工作

VS2017(自行下载)
CMAKE(自行下载)
OSG源码(https://github.com/openscenegraph/OpenSceneGraph/tree/OpenSceneGraph-3.6.5)
OSG编译依赖库(https://openscenegraph.github.io/OpenSceneGraphDotComBackup/OpenSceneGraph/www.openscenegraph.com/index.php/download-section/dependencies.html)(选择你VS对应的版本,一般VS高版本会兼容低版本,如果使用VS2022应该可以下载VS2017的)

OSG测试数据(https://openscenegraph.github.io/OpenSceneGraphDotComBackup/OpenSceneGraph/www.openscenegraph.com/index.php/download-section/data.html)

编译的目录

在这里插入图片描述
写成类似的目录。3rdParty名称要一直,且OpenSceneGraph-3.6.5下要有最顶层的CMakeLists.txt。

使用CMake构建项目

在这里插入图片描述
Where is the source code :这里表示最顶层的CMakeLists.txt的目录。
Where to build the binaries:这里表示项目构建后生成的内容放置的目录。
点击生成“Configure”,CMake会根据编写的CMakeLists.txt来找寻一些头文件静态库(可能初学者不理解,其实就是VS引入头文件和第三方库的流程,只不过VS给你封装了,初学者可能使用VS引入最容易理解,老手使用CMakeLists.txt等来配置第三方库和头文件更方便)。
第一次构建的时候会提示你要你确认创建一个目录,选中你下载的VS,Visual Studio 15 2017,后面的数字才是代表 VS2017,不要选错了,Visual Studio 17 2022表示我VS2022。如果你选择VS2017,默认编译器会选择Win32位数,需要改为x64,现在基本都是x64机构的,你先前下载的依赖也是64位的(这里要统一起来,要使用32就都使用32,要使用64就都使用64)。
在这里插入图片描述
构建后大部分的lib会自行找到,如果你的目录和我的第三库保持一致的话。

CMake构建需要注意的地方

部分libCMake不能自己找到

大部分的lib会自己找到,但是有部分lib不会自己找到。比如GDAL_LIBRARY_DEBUG,
在这里插入图片描述
选中正确的lib。
在这里插入图片描述

需要自己配置的地方

在这里插入图片描述
将BUILD_MFC_EXAMPLE勾选,将CMAKE_INSTALL_PREFIX更改为你要生成的项目的目录。

构建项目

点击“Generate”,完成之后,project目录会有很多文件生成,你可以点击“Open Project”或者打开project目录下的“OpenSceneGraph.sln”

生成前需要注意的地方

右键“Example osgviewerMFC”项目,查看C/C++的预处理器,查看预处理器定义。
在这里插入图片描述
这里可以看到系统是0x0A00,这是代表win10系统。有一个地方需要修改。
找到该项目下的stdafx.h文件改成下面两行。

17 #define WINVER 0x0A0

22 #define _WIN32_WINNT 0x0A00

复制部分lib

把目录D:\33_VS2017\IDE\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64(这是我的目录,你的目录得自己找)。把mfc140.lib mfc140d.lib mfc140u.lib mfc140ud.lib四个库复制到编译OSG的工程文件lib目录(D:\37_OSG\project\lib)下面。

批生成项目

打开VS2017后,查看一下是否为x64的。
在这里插入图片描述
生成项目:使用批生成的方式。
在这里插入图片描述
在这里插入图片描述
选择完毕后,点击生成。
这里要经过很久很久。

很久之后,编译完了。可能错误,我出现了某些找不到*.lib的错误,查询报错发现是某个使用std::max没有包含对应的头文件。
添加对应的头文件 #include

选择你需要运行的项目,右键设置为启动项目。我选择的是“Examples osgpointsprite”(公司项目这个)

在这里插入图片描述
然后运行就可以得到例子的运行结果。
在这里插入图片描述

代码层面的就编译完成。
将D:\37_OSG\project\bin添加换环境变量,这个是为了使用cmd命令时,可以正确找到exe目录(这个一般我不添加,因为环境变量添加的多,以后有什么问题不好排查,你可以进行在D:\37_OSG\project\bin进入cmd命令直接运行也是一样的)。

将库移动到正确的位置(环境变量扫盲)

1,将D:\37_OSG\3rdParty\bin目录下所有的动态链接库(*.dll)复制到D:\37_OSG\project\bin中,其实这步的目的就是把exe需要的dll放到与exe同目录下。这样是为了exe能够找到dll。

说个题外话,为什么我不喜欢添加环境变量。因为环境变量可能会被滥用。为什么你有时候写的程序可以在自己的电脑上面运行起来,在其他电脑就运行不起来。exe会找它所需要的dll,首先在同目录下面找,找不到会去系统的环境变量的目录去找,而且是按照配置的环境变量从上到下,找到了就不找了。这里包找到,不包找对。所以,举个例子,你之前用的Qt是5.13.2,并且把bin的目录都放在自己的电脑环境变量下去。并且认认真真开发了很久之后。公司业务发生调整,你现在要使用Qt5.15.2你又把bin目录放置在环境目录下,这是5.15.2的目录下5.13.2的目录的下面。你在VS配置了Qt的版本是5.15.2,写个程序发现可能就跑不起来,可能报错动态库的错误。这是因为找到5.13.2的动态库,但是你链接的lib是5.13.2的。所以你要么把环境5.15.2的目录放在5.13.2目录的前面在环境变量的配置中。最好不要那么做,因为你后面可能又要用到5.13.2的。所以最好的情况是把5.15.2的dll找到并放到exe目录下,这样才会链接正确的DLL,并且打包的时候也方便。所以建议几乎不要设置环境变量,除了个别之外。
2,将D:\37_OSG\project\lib的所有静态链接库(*.lib)复制到D:\37_OSG\project\lib中。这步是为了编译通过。
3,将D:\37_OSG\3rdParty\include的所有内容复制到D:\37_OSG\project\include中,这也是为了编译的时候能够找到头文件。

控制窗口大小

OSG的程序默认窗口最大化,按Esc退出。在学习代码和调试时不方便,测试Example时尽量将该Example的代码进行修改。将

osgViewer::Viewer viewer;

在给它传数据之后

 viewer.setSceneData(node);

添加一行代码设置窗口的位置和大小。把查看器的大小设置一下。

 viewer.setUpViewInWindow(100, 100, 800, 600);

如何使用OSG自带的测试数据

osg代码直接根据名称来获取数据:

 if (!loadedModel) loadedModel = osgDB::readRefNodeFile("cow.osgt");

有些人就不明白了,这个数据在哪里?我明明运行得到正确的结果。其实很简单,readRefNodeFile中读取文件的时候会在系统变量中找一个名称为“OSG_FILE_PATH”的系统变量,而设置这个变量值就是你下载的OSG的测试数据。
在这里插入图片描述
你要环境变量设置为这一层程序才能找的到。
在这里插入图片描述
这样你所有的OSG的测试数据都可以用上了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值