文章目录
前言
经过两三天的osg源码终于见到了“牛”。一开始是在windows11上编译的是3.6.3的版本,编译通过但是测试一直操作,一开始一直以为是系统或者版本的问题,参照其他人的博客,尝试在win10上编译3.6.5,也是编译了三四次,才编译成功。试错好多次,现在回想整个编译过程,发现无论是在win11还是win10,无论是3.6.3还是3.6.5,都是自己编译过程有所疏漏。
因此,本文参考总结多个相关博客,取其精华,记录编译过程以及相关的问题。
1、编译准备
1.1、源码、依赖、数据下载
参考:Win10+VS2017+Osg3.6.3+OsgEarth3.0编译
1.2、CMake安装
cmake直接在官网下载安装即可,cmake的版本太高,在configure的时候可能会有红色的警告(warning)提示,不影响源码编译
2、编译过程
2.1、源码依赖数据结构
参考:Windows10编译安装OpenSceneGraph(OSG)教程,个人感觉这篇博文的cmake配置说明的更清晰些。
参考了上面的博客,为了更加清晰,我自建的build和install我放在了和OpenSceneGraph同一级,build存放cmake构建出来的VS项目,install用来存放生成的lib和dll等文件。文件夹目录如下:
- D:\OSG
- OpenSceneGraph
- CMakeLists.txt等其它源码内容
- build(自己新建,编译目录)
- install(自己新建,安装目录)
- 3rdParty
- bin、gdal-data等第三方依赖内容
- OpenSceneGraph-Data
- Catch、Configuration等模型数据内容
- OpenSceneGraph
2.2、CMake构建(configure和generate)
- 打开CMake(cmake-gui)程序
- 源码目录填写D:/OSG/OpenSceneGraph-3.6.5
- 构建目录填写D:/OSG/build
- 点击Configure,在弹出的窗口中选择:
- Visual Studio 15 2017
- x64
- 出现很多行红色底纹的配置项,更改相关配置
-
编译CMAK_BUILD_TYPE,其值设置为
Release;Debug
建议设置一下,以防后续错用Debug版本的lib或者Release版本的lib -
勾选BUILD_OSG_EXAMPLES
-
CMAKE_INSTALL_PREFIX改为D:/OSG/nstall
设置安装生成lib、bin等生成的地址 -
设置3rdparty第三方依赖库的地址
Cmake时3rdparty的路径要自己设置,不要使用默认的,cmake无法逐层遍历文件夹,一定要指定到包含bin、lib、share等的文件夹,如:D:\OSG\3rdParty_x64\x64
- 继续点击Configure,直到红色底纹消失。
还是有红色的选项,BUILD_MFC_EXAMPLE 打钩(切记!!!VS2017一定要安装MFC开发组件!!!),再次点击“Configure”按钮,此时没有红色选项。 - 点击Generate,生成VS解决方案。完成后,关闭CMake。
至此,在build的目录项会生成一个VS项目,双击打开文件类型为sln
的文件。
2.3、编译
使用Visual Studio 2017打开D:\OSG\build\OpenSceneGraph.sln。
2.3.1、afxwin.h头文件修改
参考:【OSG】OSG环境部署 OSG3.6.5+vs2017+win10_x64(超详细)中第三章
为了避免ALL BUILD出现很多的错误,提前修改此头文件,文件所在Examples/osgviewerMFC/headers文件夹下,这种问题一般是因为MFC的编译平台的原因。
其中的_WIN32_WINNT=Ox0A00,表明目标平台是Win10的,对应关系如下所示:
而该工程中定义的目标平台为0x0501(该工程中的stdafx.h头文件下定义的):
0x0501是面向xp系统的,因为我使用的是Win10操作系统,所以需要进行以下修改:
2.3.2、ALL_BUILD编译
菜单生成→批生成,勾选项目ALL_BUILD对应的Debug和Release,点击生成。此过程大约需要2小时。
2.2.3、INSTALL编译
ALL_BUILD编译完成之后,需要进行INSTALL编译,同样打开生成->批生成,选择INSTALL:
3、添加环境变量
1、添加如下环境变量:
变量名 | 值 |
---|---|
OSG_ROOT | D:\OSG |
OSG_BIN_PATH | %OSG_ROOT%\install\bin |
OSG_INCLUDE_PATH | %OSG_ROOT%\install\include |
OSG_LIB_PATH | %OSG_ROOT%\install\lib |
OSG_ROOT | D:\OSG\OpenSceneGraph-3.6.5 |
OSG_SAMPLES_PATH | %OSG_ROOT%\install\share\OpenSceneGraph\bin |
OSG_FILE_PATH | D:\OSG\OpenSceneGraph-Data |
- 在PATH环境变量中添加:
- %OSG_BIN_PATH%
- %OSG_SAMPLES_PATH%
4、 测试是否安装成功
在PowerShell中使用以下命令进行测试:
- osgversion
- osglogo
- osgviewer cow.osg
说明:以上命令均为Release版,Debug版的命令需要在最后加个d,如osgversiond。
常见问题:
如果可以查看OSG版本,但无法显示Logo,需要将D:\OSG\3rdParty\bin目录下的zlib.dll和zlibd.dll复制到D:\OSG\OpenSceneGraph\install\bin目录下。
5、代码测试
-
菜单文件→新建→项目,选择Visual C++的空项目,确定。
-
工具栏中选择Debug、x64。这里要特别注意:不同的解决方案平台项目属性是需要各自配置的
-
新建源文件main.cpp,写一个空的main函数,运行一下。
-
更改项目属性:
-
C/C++ - 常规 - 附加包含目录:$(OSG_INCLUDE_PATH)
-
C/C++ - 预处理器 - 预处理器定义:WIN32、_WIN32、NDEBUG(回车符分隔)
-
链接器 - 常规 - 附加库目录:$(OSG_LIB_PATH)
-
链接器 - 输入 - 附加依赖项:osgd.lib、osgGAd.lib、osgDBd.lib、osgViewerd.lib、osgTextd.lib、osgUtild.lib、OpenThreadsd.lib(回车符分隔),这里的lib都是待d的debug版本
- main.cpp内容:
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
int main() {
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; //创建查看器
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("glider.osg"); //读取模型文件,赋值给节点指针
viewer->setSceneData(node.get()); //查看器中添加该节点
return viewer->run(); //运行查看器
}