前言
基于现有研发需求,查阅相关资料并实地验证编译方法可行性,遂以本教程记录技术实施过程,本教程目的是为编译Windows x64环境下进行地图引擎库的开发,适用于QT + VisualStudio的IDE集成开发环境。
一、准备资源
-
源码文件及版本
OpenSceneGraph-3.6.5.zip、osgearth-osgearth-3.4.zip、osgQt.zip
-
测试数据文件
OpenSceneGraph-Data-3.4.0.zip
-
OpenGL依赖
EGL-Registry-main.zip、OpenGL-Registry-main.zip、3rdParty_VS2017_v141_x64_V11_full.7z
-
OsgEarth的第三方依赖库(源码)
lerc-19542a0.zip、imgui-9e8e5ac.zip、rapidjson-f54b0e4.zip、sqlite-amalgamation-3390200.zip、sqlite-dll-win-x64-3390200.zip、glew-2.1.0-win32.zip
-
编译环境软件
-
Cmake 3.18.3、VisualStudio 2017 (以下简称VS2017)、Qt Creator 5.12.2 (以下简称Qt)
二、编译Osg
1)准备编译环境
安装Cmake、VS2017、Qt等编译环境,具体过程不在赘述,网上有很多教程,默认安装即可。
2)创建源码编译空间
在任意磁盘路径下,创建文件夹Osg,如下图所示(本人比较懒,直接在桌面建的)

-
_osgBuild: 用于存储Cmake编译的VS项目文件
-
__3rdParty_x64:__用于存储第三方依赖库(将3rdParty_VS2017_v141_x64_V11_full.7z文件解压放入该文件夹中中)
-
__OpenSceneGraph_3.6.5:__用于存放Osg3.6.5的源码(将3rdParty_VS2017_v141_x64_V11_full.7z文件解压放入该文件夹中)
-
__OpenSceneGraph-Data:__可有可无,是为了编译结束后,用里面的数据验证库编译是否成功(将OpenSceneGraph-Data-3.4.0.zip文件解压放入该文件夹中)
3)构建Osg的解决方案
打开Cmake-Gui主界面,设置源码路径、编译输出路径,如下图所示

点击”Configure“按钮,设置编译参数,如下图所示

点击“Finish”按钮,开始配置源码,等进度条走完,出现“一片红”,如下图所示

点击Ungrouped Entries项展开,在第一项ACTUAL_3RDPARTY_DIR中选择3rdParty_VS2017_v141_x64_V11_full中的x64文件夹路径,

点击BUILD项展开,勾选BUILD_OSG_EXAMPLES项,

点击CMAKE项展开,将CMAKE_INSTALL_PREFIX项的路径修改为”_osgBuild“中的OpenSceneGraph文件夹(目录下没有这个文件夹没关系,INSTALL时会自动创建),

点击OPENGL项展开,修改OPENGL_HEADER1项为#include <GL/glcorearb.h>,修改OPENGL_PROFILE项为GL3

[!NOTE]
注意:OSGEarth3.3版本必须要OSG支持GL3,所以需要另外的GL API文件
分别对EGL-Registry-main.zip、OpenGL-Registry-main.zip两个文件进行解压并打开他们的api文件夹,复制EGL-Registry-main\api文件夹中的KHR文件夹,放入Osg源码的include文件夹中(Osg\OpenSceneGraph_3.6.5\include),同样,复制OpenGL-Registry-main\api文件夹中的GL文件夹,放入Osg源码的include文件夹中(Osg\OpenSceneGraph_3.6.5\include),如下图所示
点击OSG项展开,修改OSG_GL_CONTEXT_VERSION项为3.3,
勾选
OSG_GL3_AVAILABLE
取消勾选
OSG_GL1_AVAILABLE
OSG_GL2_AVAILABLE
OSG_GLES1_AVAILABLE
OSG_GLES2_AVAILABLE
OSG_GL_DISPLAYLISTS_AVAILABLE
OSG_GL_FIXED_FUNCTION_AVAILABLE
OSG_GL_MATRICES_AVAILABLE
OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE
OSG_GL_VERTEX_FUNCS_AVAILABLE
OSG_USE_DEFRECATED_API
修改结果如下图所示,

[!NOTE]
提示:VS 2017编译提速小技巧
点开WIN32项,勾选WIN32_USE_MP,可在提升编译速度
然后一直点击"Configure"按钮直到没有红色项,从下面log可见部分库已经找到(如果没有其他要求,官网下的依赖包中的库应该就已经足够,不需要额外再下别的库了

点击“Generate”按钮,等进度条走完,下方log显示Generating done,即项目生成结束,

4)VS 2017编译Osg
在Cmake-Gui主界面,点击“Open Project”按钮,直接弹出VS2017的项目界面,或者到Osg\_osgBuild文件路径下,直接打开OpenSceneGraph.sln解决方案文件,

在解决方案管理器中打开OSG Core文件夹中的osg项目,找到头文件中的Texture文件,

双击打开Texture文件,分别注释掉第60和69行,其原因是宏GL_EXT_texture_compression_s3tc已经在glcorearb.h中定义,如若不注释掉,一般会出现重定义错误,

点击菜单栏中的"生成",下拉选择“批生成(T)”,打开Batch生成界面,勾选ALL_BUILD的Debug和Realse项,如下图所示,

点击"生成(B)“按钮,开始漫长的编译等待,编译过程中可能会出现一些警告提示,如“Unicode之类的格式问题”,这个主要是跟MSVC的编译器有关,总之无伤大雅,只要不是错误就行,差不多经过一个小时的等待(不同的电脑性能不一样,可能会更长),下方输出框生成:成功***个,失败0个,最新0个,跳过0个等信息,表示初步编译通过,如下图所示,

再次打开批生成,将ALL_BUILD的两个取消勾选,找到INSTALL勾选Debug和Release,点击”生成(B)“按钮,等待完成。
再之后,打开Osg\_osgBuild\OpenSceneGraph的目录,即是生成好了的库文件。
[!NOTE]
注意:这个目录中的include中是不带之前的GL和KHR文件夹的,记得手动复制过来。

在桌面上创建文件夹OsgEarth3.4_VS2017,将编译好的osg库复制进去,然后把之前的3rdParty文件夹复制过来,为后面编译OsgEarth备用,如下图所示

5)Osg编译有效性验证
验证之前,需要设置Osg、3rdPart对并bin文件中的环境变量,

设置完成后,记得重启一下电脑,要不然不会生效,新建OsgTest控制台项目
在Main函数中复制代码,并引入头文件,如下所示
#include <iostream>
#include <osg/Node>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
int main()
{
/* cow.osg文件路径记得改一下,换成你自己的 */
osg::Node * node = osgDB::readNodeFile("C:\\Users\\thyou\\Desktop\\Osg\\OpenSceneGraph-Data\\cow.osg");
osgViewer::Viewer viewer;
viewer.setSceneData(node);
viewer.realize();
viewer.run();
return 0;
}
右击项目属性,配置一下头文件引用范围库,如下图所示

配置引用库,如下图所示

把用到的几个lib名称添加进去,要不然提示找不到
[!NOTE]
注意:lib文件夹中名称为xxxd.lib的库文件,是debug版本的库文件,如osgd.lib是osg.lib的debug版本

点击“本地Windows调试器”,开始运行,

运行结果如下图所示

[!NOTE]
解释:因为开启了GL3,所以会对有些渲染不兼容,导致glider.osg和cow.osg的显示效果与通常的有所不同
二、编译OsgEarth
1)创建源码编译空间
在任意磁盘路径下,创建文件夹OsgEarth,如下图所示(本人比较懒,还是直接在桌面建的)

在OsgEarth\osgearth-3.4\src\third_party下imgui、lerc、rapidjson三个库为第三方,需要手动解压后拷贝到对应目录中,

对应的文件为imgui-9e8e5ac.zip、lerc-19542a0.zip、rapidjson-f54b0e4.zip,如下图所示



2)准备sqlite3、glew库
编译sqlite3库
打开VS2017,新建一个空项目,起名为sqlite3,

将sqlite-amalgamation-3390200.zip、sqlite-dll-win-x64-3390200.zip两个文件全部解压放入解决方案项目目录中,如下图所示

右键sqlite3项目,添加现有项,

右击项目选择属性,打开项目配置界面,将常规中的配置类型设置为动态库(.dll),在目标文件名后加d(这个仅Debug模式下需要设置,Release模式不需要),
[!NOTE]
注意:编译平台为x64,注意检查一下,此外Debug和Release都要设置,除了目标文件名称处有点区别,其他配置均相同,可以下来配置列表,选择“所有配置”,这样只需要设置一次即可


设置链接器-输入中模块定义文件为sqlite3.def,

在C/C+±预处理器中预处理器定义中添加以下宏:
SQLITE_CORE
SQLITE_EXPORTS
SQLITE_ENABLE_FTS3
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_SESSION
SQLITE_ENABLE_PREUPDATE_HOOK
SQLITE_ENABLE_DESERIALIZE

打开批生成界面,勾选sqlite3 x64的Debug和Release,点击“生成(B)“按钮,

生成完成后,输出窗口会提示”生成: 成功 2 个,失败 0 个,最新 0 个,跳过 0 个“信息表示编译成功。

将生成dll和lib文件分别复制到OsgEarth\sqlite-3.39.2文件夹中,其中sqlite3.dll、sqlite3d.dll文件存入bin文件夹中,sqlite3.lib、sqlite3d.lib,以及相关的pdb、exp、iobj文件全部存入lib文件夹中,将所有的头文件放入include文件夹中,如下图所示
[!NOTE]
注意:没有文件夹,手动创建即可

准备glew库
解压glew-2.1.0-win32.zip文件,同样先在OsgEarth\glew-2.1.0文件夹中创建三个文件夹,即bin、include、lib,将解压后的glew-2.1.0-win32文件夹中的对应文件下x64的文件复制到OsgEarth\glew-2.1.0文件夹中,最后把doc文件夹也复制过来(可做可不做,方便以后查看,glew32s.lib是静态库,这里我们只需要动态库,所以glew32s.lib可有可无),复制完成后如下图所示,

3)构建OsgEarth的解决方案
开始部分和Osg编译一样,打开Cmake-Gui主界面,设置源码路径、编译输出路径、选择VS编译器,如下图所示

点击”FInish“按钮以后,等待进度条走完,还是一片红,下面慢慢处理一下,

点击CMAKE项展开,将CMAKE_INSTALL_PREFIX项的路径修改为创建的项目文件夹中的OSGEARTH文件夹(目录下没有这个文件夹没关系,INSTALL时会自动创建)

点击CURL项展开,INCLUDE设置为OSG的3rdParty包中include目录,此目录下可见有curl文件夹,DEBUG和RELEASE设置为3rdParty包中lib目录下的libcurl_impd.lib和libcurl_imp.lib文件,取消静态库的勾选

然后就是下面一系列有关OSG的依赖,只用点开OSG项,在第一个OSG_DIR中设置之前OSG的CMAKE_INSTALL_PREFIX项设置的路径,然后点击”Configure“按钮,刷新完成应该会全部找到了

[!NOTE]
技巧:如果第二步中5)的操作结束后,没有将Osg、3rdParty的环境变量移除的话,上面点击”Configure“应该能将所有的库检索出来
如果再次弹出Error提示窗,查看是否是GDAL,点开并选择相关参数

依次点开OSG相关的项,应该就都自动找到了。如果还有错误,请查看依赖项是什么,根据实际情况自行下载即可,我这里只设置GLEW和SQLITE3了,
点击GLEW项展开,设置INCLUDE为之前glew的include目录,SHARED_LIBRARY_DEBUG为glew32d.lib,SHARED_LIBRARY_RELEASE为glew32.lib

点击SQLITE3项展开,设置INCLUDE为之前sqlite3的include目录(这里我没有新建单独的include文件夹,.h文件直接放在了根目录下),LIBRARY为sqlite3.lib

点击OSGEARTH项展开,这里有几种NodeKit,可以根据需要勾选,勾选后可能会需要另外的第三方依赖(例如Triton和Silverlining),请自行下载,这里我就保持默认,然后仅勾选OSGEARTH_INSTALL_SHADERS项

最后点击Generate按钮,等待项目生成完毕

4)VS 2017编译OsgEarth
在Cmake-Gui主界面,点击“Open Project”按钮,直接弹出VS2017的项目界面,或者到OsgEarth\_osgearthBuild文件路径下,直接打开OSGEARTH.sln解决方案文件,

打开批生成,勾选ALL_BUILD的Debug和Release,

点击“生成(B)”按钮,开始编译所有源码,之前要前面顺利,这个地方应该是没有错误的,等待全部生成后,输出窗体提示“成功 140 个,失败 0 个,最新 0 个,跳过 0 个”信息,

再次打开批生成,取消ALL_BUILD的Debug和Release的勾选,找到INSTALL并勾选其Debug和Release,点击生成按钮,等待完成。

打开之前CMAKE_INSTALL_PREFIX项中设置的目录(OsgEarth_osgearthBuild\OSGEARTH),即是生成好了的库文件。

至此,osgEarth的编译就算是完成了,下面整理一下,
首先,选定一个磁盘位置,创建osgEarth文件夹,把3rdParty,之前生成的osg库,以及刚刚生成的osgEarth库,全部放进去,如下图所示,

然后把glew、sqlite的库文件合并到3rdParty中,注意对号入座,bin对bin,include对include、lib对lib合并即可,

5)OsgEarth编译有效性验证
验证之前,需要更新和设置环境变量,上一步已经把编译好的osg、osgEarth都合并整理好了,所以原来osg、3rdParty的环境变量也就失效了,下面打开系统环境变量,在系统环境变量(S)中找到path项,点击“编辑(I)“按钮,删除原来的osg、3rdParty的bin路径,换成刚整理好的路径,如下图所示

设置完成后,重启电脑,确保环境变量生效,从重启电脑后,打开命令行,输入”osgearth_version“后回车,显示版本信息,

至此环境变量生效,在桌面新建一个test文件夹,将OsgEarth源码目录下的data文件夹中的world.tif复制进去,然后新建一个txt文件,后缀改为simple.earth,内容写:
<map>
<GDALImage name="simple">
<url>world.tif</url>
</GDALImage>
</map>

打开命令行,进入到test文件夹中,输入”osgearth_viewer simple.earth“回车,

显示一个粗糙的地球,表示编译的osgearth库是有效的。
[!NOTE]
提醒:部分电脑使用了分屏,可能会显示不出来,只留一个显示器,就能弹出这个界面了

三、编译OsgQt
1)创建源码编译空间
在任意磁盘路径下,创建文件夹OsgQt,将OsgQt.zip文件解压到该文件夹,并创建编译文件夹_osgQtBuild,如下图所示

2)构建OsgQt的解决方案
开始部分和OsgEarth编译一样,打开Cmake-Gui主界面,设置源码路径、编译输出路径、选择VS编译器,如下图所示

点击“Finish”按钮,等待进度条走完,同样是一片红,如果前面没有这是Osg、OsgEarth、3rdParty的环境变量,应该会弹出Error提示窗,下面log显示找不到OSG相关的库,这样会比较麻烦点,需要一个个的手动填写,如果前面设置了环境变量,这里应该和我一样,基本上都已经全部检测出来了,只需要挨个检查一下即可,

点击Ungrouped Entries项展开,设置Qt5_DIR为:

点击CMAKE项展开,将CMAKE_INSTALL_PREFIX项的路径修改为创建的项目文件夹中的OSGQt文件夹(目录下没有这个文件夹没关系,INSTALL时会自动创建)。

点击“Configure”按钮,应该是没有报错了,log中有一些红色的Warning文本,这个可以不用管,然后点击“Generate”按钮,等待项目生成完毕。

3)VS 2017编译OsgQt
在Cmake-Gui主界面,点击“Open Project”按钮,直接弹出VS2017的项目界面,或者到OsgQt\_osgQtBuild文件路径下,直接打开osgQt.sln解决方案文件,

打开项目, 双击打开OSG Core项目文件夹中的Header Files中的osgQOpenGLWidget和osgQOpenGLWindow,分别将其第15行 #define _gl_h 的注释解开,因为默认下会导致启用系统的gl.h文件,并与之前下载的glcorearb.h文件产生冲突,出现接口重定义的问题,

接着跟之前的一样,点击生成-批生成,在弹出的子窗口中勾选ALL_BUILD的Debug和Release,然后点击生成按钮,等待生成完,,应该是不会有失败的。

然后再次打开批处理界面,取消ALL_BUILD的Debug和Release的勾选,勾选INSTALL的Debug和Release,然后点击生成按钮,等待生成完成。

再之后,打开OsgQt\_osgQtBuild\OSGQT的目录,即是生成好了的库文件。

在之前osgEarth的文件夹内创建osgQt文件夹(设置环境变量的那个文件夹),将编译好的osgQt库复制进去,为后面测试OsgQt备用。

4)OsgQt编译有效性验证
添加环境变量,复制osgQt的bin文件夹以及osgQt\share\OpenSceneGraph的bin路径,添加到系统环境变量的path中,如下图所示

打开电脑中的Qt 5.12.2(MSVC 2017 64-bit)命令行工具,如下图

将位置切换到osgQt\share\OpenSceneGraph\bin路径下,输入命令“windeployqt osgviewerQt.exe”,

然后回车,它会将osgviewerQt.exe需要的Qt库复制进去。

同样,输入命令“windeployqt osgviewerQtd.exe”,然后回车,把osgviewerQtd.exe需要的Qt库也复制进来,

设置完成后,重启电脑,确保环境变量生效,重启电脑后,打开cmd命令窗口,用cd命令切换到osg数据目录下,输入命令“osgviewerQt glider.osg”,

然后回车,打开滑翔机三维视图,至此,验证编译通过。

四、结语
所有的编译就均已完成。
整个过程差不多耗时4个半小时左右,中间出现了一些小插曲,主要是相关版本问题,引用的第三方库一定要确认版本是否正确,否则会出现函数找不到的问题,另外就是中间编译好的一些库,尽量整理好,添加环境变量,这样后面Camake编译的时候,有很多能够自动找到,不用再挨个去配置,能节省不少时间和精力,
后面就是项目上的开发了,添加环境变量,引用库进行开发即可。

