ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OSG 3.6.5与OsgEarth 3.1预编译库:VS2019环境下的三维GIS开发快速入门指南

OSG 3.6.5与OsgEarth 3.1预编译库:VS2019环境下的三维GIS开发快速入门指南 简介本资源是面向三维地理信息系统GIS开发与仿真可视化工程师的OpenSceneGraph 3.6.5与OSGEarth 3.1完整编译库专为Windows 10平台、Visual Studio 2019环境深度适配。解决了开发者在VS2019下手动编译OSG/OSGEarth时常见的依赖冲突、CMake配置繁琐、Debug/Release版本不一致等痛点可直接集成至项目用于三维地形渲染、空间分析、虚拟仿真等工程实践。压缩包共1325个文件含302个运行时DLL、38个静态LIB、18个导出定义文件及大量头文件.h、着色器.glsl、配置脚本与核心模块如terrain、elevation、tilesource、shadowmap、geometrypool等总大小53.55MBbin/include/lib三目录结构完备覆盖全部必需组件。目前已有850人下载学习实测通过多轮构建验证支持即开即用、跨项目复用并包含ActionAnimation、DatabasePager、TerrainEngineRequirements、TileSourceElevationLayer等关键功能模块的完整符号导出显著降低三维引擎二次开发门槛。1. 项目概述与核心价值最近在整理硬盘翻出来一个压箱底的宝贝Osg3.6.5-OsgEarth3.1-x64-vs2019-release-debug-win10.rar。这名字一看就很“硬核”对刚接触三维地理可视化开发的朋友来说可能像天书但对于我们这些常年跟OpenSceneGraphOSG和OsgEarth打交道的老兵这简直就是一个“开箱即用”的救命稻草。简单说这是一个已经为Windows 10 64位系统、使用Visual Studio 2019编译好的OSG 3.6.5和OsgEarth 3.1开发库同时包含了Release发布和Debug调试两种版本。你不需要再从源码开始经历漫长且充满“坑”的编译过程解压配置一下就能立刻投入到三维地球应用的开发中。为什么说它价值巨大因为OSG和OsgEarth的源码编译尤其是两者版本的匹配、第三方依赖库的获取与编译是新手入门的第一道也是劝退率最高的一道门槛。官方文档往往只给出指导性意见实际环境中编译器版本、Windows SDK版本、第三方库的版本差异都会导致编译失败。这个打包好的库相当于有人帮你把所有这些脏活累活都干完了并且验证了在VS2019下的可用性。它解决的核心痛点就是让开发者跳过繁琐、易错的编译环境搭建阶段直接进入应用开发环节极大地降低了学习曲线和项目启动成本。无论是想快速验证一个三维GIS想法还是进行教学演示亦或是中小型项目的原型开发这个库都能提供即战力。2. 库内容深度解析与结构梳理解压这个RAR文件后你会看到一个结构清晰的目录树。理解这个结构是正确使用它的第一步。通常一个成熟的预编译库会包含以下几个核心部分2.1 核心库文件组织库的根目录下一般会有include、lib、bin、share或data等文件夹以及非常重要的CMake或FindXXX.cmake文件。include目录这是所有头文件.h, .hpp的所在地。OSG和OsgEarth都是模块化设计的所以你会看到osg、osgDB、osgGA、osgViewer、osgEarth、osgEarthUtil等一系列子文件夹。你的编译器需要通过设置“附加包含目录”来找到这里否则代码中的#include osg/Node就会报错。这个打包库的include目录应该是完整的包含了从3.6.5和3.1版本源码中生成的所有公共头文件。lib目录这是库文件.lib静态库或.lib导入库 .dll动态链接库的核心存放地。关键点在于这里通常会进一步区分为Release和Debug子目录或者通过库文件后缀名来区分如osgd.lib是Debug版osg.lib是Release版。这个Osg3.6.5-OsgEarth3.1库明确包含了两种配置因此lib目录下很可能有debug和release两个文件夹里面分别存放着对应配置下编译出来的.lib文件。在Visual Studio中链接时必须根据你的项目配置Debug或Release链接对应版本的库混用会导致运行时崩溃或链接错误。bin目录这里存放着运行时所需的动态链接库.dll文件。同样它可能也分为debug和release子目录。Debug版的DLL通常更大包含了调试符号信息便于在VS中调试时跟踪到OSG/OgEarth的内部代码。当你编译好自己的应用程序后需要将对应配置的DLL文件复制到你的可执行文件.exe同级目录下否则程序会因找不到动态库而无法启动。这里通常还包含一些OSG和OsgEarth自带的工具程序如osgviewer.exe模型查看器、osgearth_viewer.exe地球查看器等它们是验证库是否正常工作的最直接工具。share或data目录存放着OSG和OsgEarth运行时所需要的数据文件例如字体、插件所需的默认资源、坐标系定义文件对于OsgEarth尤其重要、图标等。OsgEarth的很多功能如加载在线地图、使用特定高程数据格式都依赖于这个目录下的资源。在部署你的应用程序时这个目录或其内容也需要一并打包。2.2 Release与Debug双版本的意义提供双版本是专业预编译库的标配它们服务于开发的不同阶段Debug版本在Visual Studio中开发调试时使用。它关闭了大部分编译器优化使得生成的代码更易于单步跟踪。同时它启用了断言assert检查、内存泄漏检测等调试辅助功能。当你程序崩溃时Debug版库能提供更详细的调用堆栈信息帮助你快速定位问题。缺点是运行速度慢文件体积大。Release版本用于最终的产品发布和性能测试。编译器会进行全方位的优化如内联函数、循环展开等使得程序运行速度达到最快。同时它移除了所有调试信息体积更小。在开发后期进行性能分析和打包分发时必须切换为Release配置。注意在Visual Studio的项目属性中调试器要启动的可执行文件、工作目录、环境变量PATH等设置都需要与你当前活动的解决方案配置Debug/Release匹配。一个常见的错误是在Debug配置下运行却把Release版的DLL放在了工作目录这可能导致看似能启动但一执行到某些复杂功能就崩溃且难以调试。2.3 第三方依赖库的包含情况OSG和OsgEarth的强大功能建立在众多优秀的第三方库之上例如GDAL用于读写各种栅格和矢量地理数据格式。Geos提供几何图形拓扑运算功能。LibCurl用于网络请求支持OsgEarth的在线地图服务。FreeType用于字体渲染。JPEG, PNG, TIFF库用于图像编解码。ZLib, LibZip用于数据压缩。一个完整的预编译包必须将这些第三方库的include、lib、binDLL也一并打包并且确保其版本与OSG/OsgEarth编译时使用的版本一致。这个vs2019版本的包其价值就在于它已经处理好了所有这些依赖关系所有库都是用VS2019的特定运行时库如MSVCP140, VCRUNTIME140编译的避免了令人头疼的“运行时库不兼容”错误。3. 在Visual Studio 2019中的配置实战拿到库之后最关键的一步就是在你的VS2019项目中正确配置。下面我们以一个全新的“Win32控制台应用程序”或“空项目”为例一步步进行配置。3.1 创建项目与基础设置首先创建一个新的C项目。建议选择“空项目”避免VS模板生成的多余代码干扰。创建好后右键项目 - 属性进入配置页面。一个至关重要的习惯是将顶部的“配置”从“活动(Debug)”切换到“所有配置”。这样你在“附加包含目录”、“附加库目录”等路径设置时一次操作就能同时应用于Debug和Release避免了重复劳动和配置不一致导致的错误。平台工具集与字符集在“常规”属性页确保“平台工具集”是“Visual Studio 2019 (v142)”与编译此库的工具集一致。“字符集”建议使用“使用多字节字符集”因为很多第三方库如GDAL的接口对Unicode支持的历史遗留问题使用多字节字符集能减少一些潜在的编译错误。C语言标准在“C/C” - “语言”中将“C语言标准”设置为“ISO C17 标准”或更高。OSG 3.6.5和OsgEarth 3.1的代码已经支持现代C标准。3.2 包含目录与库目录配置这是连接你的代码和预编译库的桥梁。附加包含目录在“C/C” - “常规” - “附加包含目录”中添加路径。你需要添加你的库路径/includeOSG和OsgEarth的头文件你的库路径/include/第三方库名如果第三方库的头文件被单独放在了include的子目录下例如include/gdal那么也需要添加。通常一个组织良好的包会把所有头文件扁平化或集中放在include下但需要检查确认。 添加时建议使用$(SolutionDir)..\lib\Osg3.6.5-OsgEarth3.1-x64-vs2019\include这样的相对路径宏这样当你的解决方案目录移动时配置依然有效。附加库目录在“链接器” - “常规” - “附加库目录”中添加路径。这里需要区分配置对于Debug配置添加你的库路径/lib/debug或者包含osgd.lib等文件的目录对于Release配置添加你的库路径/lib/release或者包含osg.lib等文件的目录 同样使用相对路径宏。你可以通过属性页顶部的“配置”下拉框分别切换Debug和Release来设置也可以使用$(Configuration)宏来创建一个通用路径如你的库路径/lib/$(Configuration)前提是库的目录结构确实是lib/debug和lib/release。3.3 输入依赖库的指定告诉链接器具体需要链接哪些.lib文件。在“链接器” - “输入” - “附加依赖项”中手动添加你需要链接的库文件名。这里必须严格区分Debug和Release。通常Debug版库文件名后带有‘d’后缀。一个基础的OSGOsgEarth程序可能需要链接的库如下以Debug为例Release则去掉‘d’osgd.lib osgDBd.lib osgUtild.lib osgGAd.lib osgViewerd.lib osgTextd.lib osgEarthd.lib osgEarthUtild.lib OpenThreadsd.lib实际上所需的库远不止这些取决于你使用了哪些模块如osgShadow,osgParticle,osgEarthFeatures等。一个更可靠的方法是查看库的lib目录把所有.lib文件的名字去掉后缀都列出来然后根据你的项目需求进行删减。或者你可以先只添加最核心的几个编译时如果出现“无法解析的外部符号”链接错误再根据错误提示信息中提到的函数或类所属的模块添加对应的库。3.4 运行时环境与调试部署工作目录与DLL在“调试”属性页将“工作目录”设置为你的库路径/bin/debug对于Debug配置。这样当你从VS启动调试时程序会自动在该目录下寻找所需的DLL。更常见的做法是将bin/debug或bin/release目录下的所有DLL复制到你的项目生成的可执行文件.exe所在的目录通常是$(SolutionDir)$(Configuration)\。你可以通过项目属性的“生成事件” - “后期生成事件”中添加命令行命令来自动完成复制例如xcopy /Y /E 你的库路径\bin\$(Configuration)\*.* $(TargetDir)环境变量PATH作为备选方案你也可以将你的库路径/bin添加到系统的PATH环境变量中但这会影响全局且可能引起版本冲突不推荐作为主要方法。4. 验证库可用性与首个测试程序配置完成后最好的验证方式就是写一个最简单的程序并运行。4.1 经典“Hello World”地球查看器下面是一个使用OsgEarth创建一个最简单地球视图的示例代码#include osgViewer/Viewer #include osgEarth/MapNode #include osgEarth/Viewpoint #include osgEarth/EarthManipulator int main(int argc, char** argv) { // 1. 初始化Viewer osgViewer::Viewer viewer; // 2. 创建一个基本的Map并添加一个影像图层这里使用ArcGIS在线地图服务 osgEarth::Map* map new osgEarth::Map(); osgEarth::TileSourceOptions imageryOpt; imageryOpt.url() https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer; map-addLayer(new osgEarth::ImageLayer(World Imagery, imageryOpt)); // 3. 将Map包装成MapNode并设置为Viewer的场景数据 osgEarth::MapNode* mapNode new osgEarth::MapNode(map); viewer.setSceneData(mapNode); // 4. 设置地球操作器鼠标键盘控制 viewer.setCameraManipulator(new osgEarth::EarthManipulator()); // 5. 设置一个初始的视点例如看向中国 osgEarth::Viewpoint vp; vp.focalPoint() osgEarth::GeoPoint(osgEarth::SpatialReference::get(wgs84), 116.4, 39.9, 0); // 北京 vp.heading()-set(-90, osgEarth::Units::DEGREES); // 朝向 vp.pitch()-set(-45, osgEarth::Units::DEGREES); // 俯角 vp.range()-set(5e6, osgEarth::Units::METERS); // 视点距离 viewer.getCameraManipulator()-setViewpoint(vp); // 6. 运行Viewer return viewer.run(); }将这段代码放入你的项目源文件中编译确保是Debug配置。如果一切配置正确编译会成功。运行程序你应该能看到一个窗口里面加载了全球的卫星影像并且初始视角定位在了北京上空。你可以用鼠标拖拽、滚轮缩放来浏览地球。4.2 使用自带工具验证如果编写代码遇到问题一个更直接的验证方法是运行库自带的工具。找到bin/debug目录下的osgviewer.exe和osgearth_viewer.exe。运行osgviewer.exe它会打开一个命令行窗口。你可以直接将一个.osgb或.ive等OSG支持的模型文件拖拽到窗口里查看。如果能正常显示模型说明OSG核心库和OpenGL驱动是正常的。运行osgearth_viewer.exe它会直接打开一个地球窗口。你可以尝试在命令行中指定一个.earth文件OsgEarth的场景定义文件例如osgearth_viewer.exe mymap.earth。如果它能正常运行并显示地球说明OsgEarth及其所有依赖库GDAL, Curl等都配置正确。5. 常见问题排查与深度避坑指南即使使用了预编译库在实际项目中依然会遇到各种问题。下面是我在多年使用中总结的一些典型问题及其解决方案。5.1 编译与链接错误“无法打开包括文件: ‘osg/Config’”或类似错误原因附加包含目录设置错误或者路径中包含中文字符或特殊字符。解决检查项目属性中的“附加包含目录”确保路径指向正确的include文件夹。使用英文路径避免空格和特殊字符。可以尝试使用绝对路径来排除相对路径宏的问题。“LNK1104: 无法打开文件‘osgd.lib’”或“LNK2001: 无法解析的外部符号”原因“无法打开文件”附加库目录设置错误或者库文件名拼写错误。“无法解析的外部符号”通常意味着链接的库不全。这个错误信息是关键它会告诉你哪个函数或类找不到。例如错误提到osgEarth::Registry说明你需要链接osgEarthd.lib如果提到osgDB::readNodeFile说明你需要链接osgDBd.lib。解决仔细核对“附加库目录”和“附加依赖项”。对于外部符号错误根据错误提示的函数名判断它属于哪个模块然后添加对应的库。搜索引擎是你的好帮手搜索“osgEarth::XXX 在哪个库”通常能找到答案。确保Debug配置链接的是带‘d’后缀的库Release配置链接的是不带‘d’的库。“应用程序无法正常启动(0xc000007b)”原因这是最经典的错误意味着应用程序在运行时找不到某个DLL或者找到了但版本不匹配例如32位程序试图加载64位DLL或者反之。在这个场景下很可能是你的程序是Debug配置却加载了Release版的DLL或者系统PATH中其他软件的DLL干扰。解决使用Dependency Walker或Visual Studio自带的dumpbin /dependents your.exe命令查看你的exe文件依赖哪些DLL。确保你的exe所在目录下或系统PATH能找到的目录下存在所有必需的、且版本匹配的DLL。将bin/debug下的所有DLL复制到exe目录是最稳妥的方法。检查项目属性中“C/C” - “代码生成” - “运行时库”设置。这个必须与预编译库的编译设置一致。通常预编译的Debug库使用“/MDd”多线程调试DLLRelease库使用“/MD”多线程DLL。如果库是用“/MT”静态链接运行时库编译的而你的项目设置是“/MD”也会导致冲突。这个信息通常由库的提供者说明如果不确定可以尝试在项目属性中切换这几个选项试试。5.2 运行时错误与性能问题程序启动后黑屏或闪退原因可能是OpenGL上下文创建失败或者显卡驱动不支持所需的OpenGL特性。解决检查显卡驱动是否为最新。在代码中可以在创建Viewer后通过viewer.getCamera()-getGraphicsContext()来检查图形上下文是否创建成功。也可以尝试在osgViewer::Viewer构造函数之前设置环境变量OSG_NOTIFY_LEVEL为INFO或DEBUG这样OSG会在控制台输出更详细的日志帮助定位问题。加载在线地图或高程数据缓慢或失败原因网络问题或者OsgEarth的缓存路径不可写或者GDAL驱动缺失。解决检查网络连接。设置OsgEarth的缓存目录。可以在代码中通过osgEarth::Drivers::TMSOptions等图层选项设置url和cache策略也可以设置环境变量OSGEARTH_CACHE_PATH。确认bin目录下包含了GDAL的所有插件DLL如gdal_XYZ.dll。OsgEarth依赖GDAL来读取多种格式的本地数据。Debug版程序运行极慢原因这是正常现象。Debug版关闭了优化并加入了大量调试检查。此外如果场景非常复杂每帧的遍历和状态检查也会拖慢速度。解决性能测试和最终发布请务必使用Release版。在Debug模式下开发时可以简化场景进行功能调试。5.3 环境与部署相关在其他电脑上运行程序失败原因目标电脑缺少必要的运行时库如VC Redistributable for Visual Studio 2019或OSG/OgEarth的DLL。解决对于VC运行时库可以要求用户安装对应的Visual C Redistributable包或者使用“静态链接运行时库”/MT或/MTd的方式编译你的程序但这会增大exe体积且需要确保所有第三方库也是用相同设置编译的通常不推荐。对于OSG/OgEarth的DLL你必须将它们与你的exe一起分发。创建一个安装程序将这些DLL和你的程序一起打包安装到目标机器的程序目录下。与项目中其他第三方库冲突原因你的项目可能还使用了其他库如Boost, Qt, PCL等它们可能依赖不同版本的相同第三方库如zlib, libpng。解决这是最棘手的问题之一。尽量确保整个项目使用的所有第三方库版本一致。如果无法做到可以尝试将冲突的库静态链接到各自的主库中或者使用动态加载LoadLibrary的方式在运行时隔离。在链接顺序上也可以做一些调整但效果有限。这个Osg3.6.5-OsgEarth3.1-x64-vs2019-release-debug-win10.rar库是一个强大的起点但它并非一劳永逸。随着项目深入你可能会需要特定版本的插件、需要自己编译带有特殊功能的OSG如开启NVTT纹理压缩支持或者需要集成更新的第三方库。那时你可能还是需要回过头来学习如何从源码编译。但在此之前这个预编译库能为你节省数百小时的摸索时间让你快速领略到OSG和OsgEarth构建三维地理世界的强大能力。从用它跑通第一个地球程序开始你的三维GIS开发之旅就算正式上路了。本文还有配套的精品资源点击获取
返回列表