VS2019下OSG 3.6.5与OSGEarth预编译3rdParty环境搭建指南

简介:本资源为基于Visual Studio 2019预编译的OSG3.6.5与OSGEarth 2.10配套第三方库,面向从事三维地理可视化、虚拟仿真与数字地球开发的中高级C++工程师,解决自行编译依赖库耗时长、易出错的问题。压缩包共约2000个文件,整体137.76MB,以1351个h头文件、56个lib静态库、32个cmake配置、28个inc及22个c源文件为主,另含少量dll、hpp、proto等,覆盖头文件声明、链接库与构建脚本,可直接接入VS2019工程。目录中附带大量时区与地名数据文件,如Abidjan、Accra、Addis_Ababa、Aden、Alaska等,便于地理坐标与时间系统相关模块的调试。已有626人学习下载,适合需要快速搭建OSG与OSGEarth开发环境、验证三维渲染与地球场景加载的读者,能省去繁琐的依赖编译环节,将精力集中于业务功能开发与效果调优。

1. 从一次编译失败说起:为什么我最终选了预编译的 3rdParty

如果你在 Windows 上从源码编译过 OSG,大概率经历过这样的场景:CMake 配置点下 Generate 的那一刻,满屏红字告诉你 zlib 找不到、libpng 版本不匹配、freetype 链接失败。我前后装过不下十次 OSG 环境,从 OSG 3.4 一路折腾到 3.6.5,最深的体会就是——OSG 本身不难编译,难的是它背后那一长串第三方依赖。尤其是当你还要在上面叠一层 OSGEarth 的时候,GDAL、PROJ、CURL、SQLite3 这些库的版本兼容问题能把人逼疯。所以这篇笔记记录的是我目前最省事的一套方案:直接用预编译好的 3rdParty.zip 三方库,配合 OSG 3.6.5 和 OSGEarth,在 VS2019 下把整套环境跑起来。适合那些不想在依赖编译上耗一整天、只想赶紧把场景跑出来的开发者。

2. 环境准备:VS2019 + CMake + OSG3.6.5 源码与 3rdParty 的版本对齐

2.1 为什么版本对齐比什么都重要

OSG 的第三方库有一个非常要命的特点:它跟编译器版本、运行库模式(MT/MD)、Debug/Release 配置是强绑定的。你拿一个用 VS2017 编译的 3rdParty 去配 VS2019 的工程,链接阶段一定报 LNK2019 或 LNK2038。这不是玄学,是 ABI 不兼容。所以第一步不是急着下载,而是先把版本关系理清楚。

我一般会按下面这张表来核对,缺一项都不往下走:

组件版本要求说明
Visual Studio2019(v142 工具集)3rdParty 必须是对应 v142 编译的
CMake3.20 以上低于 3.15 对 VS2019 支持不完整
OSG3.6.5与 3rdParty 主版本一致
OSGEarth3.2 及以上需与 OSG 3.6.x 匹配
3rdParty预编译 zip必须含 x64 目录,且区分 Debug/Release

这里最容易翻车的是 3rdParty 的架构。网上流传的包有的是 Win32 的,有的是 x64 的,混用直接编译不过。我建议统一走 x64,因为现在 GDAL、PROJ 这些库在 x64 下的预编译包更全。

2.2 目录规划:别把源码和依赖搅在一起

我习惯在磁盘根目录建一个干净的工作区,路径里不要有中文和空格,这是血泪经验——CMake 对含空格路径的处理在某些模块上会出问题。结构大概是这样:

D:\OSG_Workspace\ ├── OSG\ # OSG 3.6.5 源码 ├── OSGEarth\ # OSGEarth 源码 ├── 3rdParty\ # 解压后的预编译三方库 │ ├── include\ │ ├── lib\ │ └── bin\ ├── build_osg\ # OSG 的 CMake 构建目录 └── build_osgearth\ # OSGEarth 的 CMake 构建目录

3rdParty.zip 解压后,先确认里面有没有x64子目录。有些包的结构是3rdParty/x64/include,有些是3rdParty/include直接放 64 位库,这两种在 CMake 里填的路径不一样,后面会讲。

2.3 安装 CMake 与确认 VS2019 工具集

CMake 直接去官网下 Windows 的 installer,安装时勾选“Add CMake to the system PATH”。装完在命令行验证:

cmake --version # 输出应为 cmake version 3.20.x 或更高

VS2019 这边要确认安装了“使用 C++ 的桌面开发”工作负载,并且 v142 工具集可用。可以在 VS Installer 里检查,也可以直接看目录:

dir "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC" # 应能看到类似 14.29.xxxxx 的目录

如果这里只有 14.2 以下的版本,说明 v142 没装全,后面 CMake 生成工程时会找不到编译器。这一步别跳过,我见过太多人卡在这里还以为是 3rdParty 的问题。

3. 编译 OSG 3.6.5:CMake 配置里那几个必须改的变量

3.1 CMake 首次配置与 3rdParty 路径填写

打开 CMake GUI,Source 选D:/OSG_Workspace/OSG,Build 选D:/OSG_Workspace/build_osg。点 Configure,选择 “Visual Studio 2019” 和 “x64”。

第一次 Configure 会报一堆找不到第三方库的错,这是正常的。关键是找到这几个变量并手动指定:

  • ACTUAL_3RDPARTY_DIR:指向 3rdParty 的根目录,比如D:/OSG_Workspace/3rdParty
  • CMAKE_INSTALL_PREFIX:指向你希望安装 OSG 的位置,比如D:/OSG_Workspace/OSG_Install
  • BUILD_OSG_EXAMPLES:建议先关掉,等核心库编译通过再开,能省不少时间

如果 3rdParty 包里是x64子目录结构,ACTUAL_3RDPARTY_DIR要填到3rdParty这一层,CMake 会自动去拼x64/lib。填错的话,zlib、libpng 这些会一直显示 NOTFOUND。

3.2 关键参数取舍:Debug 与 Release 的库路径

OSG 的 CMake 脚本会根据当前配置去 3rdParty 里找对应后缀的库。预编译包里通常长这样:

3rdParty/lib/ ├── zlib.lib ├── zlibd.lib ├── libpng.lib ├── libpngd.lib └── ...

带d后缀的是 Debug 版。如果你只编译 Release,那没问题;但如果要 Debug 和 Release 都出,就得确保两套库都在。我一般会先只编 Release,跑通之后再补 Debug,避免一开始就被一堆 Debug 链接错误劝退。

在 CMake 里还要注意CMAKE_DEBUG_POSTFIX这个变量,OSG 默认给 Debug 库加d后缀,跟 3rdParty 的命名是对应的,不要随意改。

3.3 生成、编译与安装

Configure 没有红色报错之后,点 Generate。然后用管理员权限打开 VS2019 的 x64 命令行,进入 build 目录:

cd D:\OSG_Workspace\build_osg cmake --build . --config Release --target INSTALL

--target INSTALL会直接把编译好的库和头文件复制到CMAKE_INSTALL_PREFIX指定的目录。编译过程大概十几到二十分钟,取决于机器。如果中途报某个 3rdParty 库找不到,回到 CMake 看对应变量是不是 NOTFOUND,手动补上路径再 Generate 一次。

编译完成后,去OSG_Install目录下确认有include、lib、bin三个文件夹。bin里应该有osg165-osg.dll、osgDB165-osg.dll这类文件。版本号 165 对应 OSG 3.6.5,这个数字后面配环境变量要用到。

4. 编译 OSGEarth:依赖 OSG 安装路径与 GDAL/PROJ 的衔接

4.1 让 CMake 找到刚装好的 OSG

OSGEarth 的构建目录单独建一个build_osgearth。Source 选D:/OSG_Workspace/OSGEarth,Build 选D:/OSG_Workspace/build_osgearth。

第一次 Configure 同样会报错,重点是这几个变量:

  • OSG_DIR:指向D:/OSG_Workspace/OSG_Install/lib/cmake/osg或者OSG_Install根目录,取决于 OSG 安装时有没有生成 CMake 配置文件
  • ACTUAL_3RDPARTY_DIR:跟 OSG 一样,指向同一个 3rdParty
  • CMAKE_INSTALL_PREFIX:指向D:/OSG_Workspace/OSGEarth_Install

如果OSG_DIR填对了但 CMake 还是找不到 OSG,检查一下OSG_Install下有没有lib/cmake/osg目录。有些编译方式不会生成这个,那就得手动指定OSG_INCLUDE_DIR和OSG_LIBRARY。

4.2 GDAL 与 PROJ 的版本坑

OSGEarth 对 GDAL 的版本比较敏感。3rdParty 包里带的 GDAL 通常是 3.x 系列,但不同小版本之间 API 有变动。如果编译时报 GDAL 相关的函数找不到,先确认 3rdParty 里的 GDAL 头文件和 lib 是不是同一版本。

常见做法是在 CMake 里显式指定:

GDAL_INCLUDE_DIR = D:/OSG_Workspace/3rdParty/include GDAL_LIBRARY = D:/OSG_Workspace/3rdParty/lib/gdal.lib

PROJ 也是类似,OSGEarth 用它做坐标转换。如果 3rdParty 里 PROJ 的版本太老,可能会在链接阶段报proj_api.h找不到——那是 PROJ 5 以前的头文件,新版已经改成proj.h了。这种情况要么换 3rdParty 包,要么在 CMake 里关掉相关模块。

4.3 编译与安装 OSGEarth

配置通过后,同样用命令行编译:

cd D:\OSG_Workspace\build_osgearth cmake --build . --config Release --target INSTALL

OSGEarth 的编译时间比 OSG 短一些,但依赖 GDAL 的模块会慢。编译完成后,OSGEarth_Install/bin下会有osgEarth.dll、osgEarthUtil.dll等文件。

这里有个细节:OSGEarth 的 DLL 依赖 OSG 的 DLL,所以运行时PATH里必须同时包含 OSG 和 OSGEarth 的 bin 目录,以及 3rdParty 的 bin 目录。少一个就是“找不到 xxx.dll”的弹窗。

5. 避坑与排查:链接错误、DLL 缺失、CMake 缓存这几种翻车

5.1 现象:LNK2038 检测到“RuntimeLibrary”的不匹配

原因:3rdParty 库是用/MD编译的,而你的工程用了/MT,或者反过来。VS 的默认运行库设置和预编译库不一致。

解决:在 CMake 里统一设置CMAKE_MSVC_RUNTIME_LIBRARY为MultiThreadedDLL(对应/MD)。如果 3rdParty 是/MT的,那就改成MultiThreaded。不确定的话,用dumpbin /directives zlib.lib看一下里面的/DEFAULTLIB是MSVCRT还是LIBCMT。

5.2 现象:编译通过,但运行示例程序时弹窗缺osg165-osg.dll

原因:PATH环境变量没配全,或者配了但没生效。

解决:把下面三个路径都加到系统PATH里,然后重启命令行或 IDE:

D:\OSG_Workspace\OSG_Install\bin D:\OSG_Workspace\OSGEarth_Install\bin D:\OSG_Workspace\3rdParty\bin

注意 3rdParty 的 bin 目录可能是在x64/bin下面,别填错层级。

5.3 现象:CMake 反复报同一个变量 NOTFOUND,手动改了下次 Configure 又变回去

原因:CMake 缓存里存了旧值,或者变量名拼写和 CMake 脚本里期望的不一致。

解决:直接删掉 build 目录下的CMakeCache.txt,重新 Configure。我一般遇到诡异问题时第一反应就是删缓存重来,比逐行排查快得多。

5.4 现象:OSGEarth 编译到某个模块时报 GDAL 函数未定义

原因:3rdParty 里的 GDAL 版本和 OSGEarth 源码期望的不一致,通常是 GDAL 3.x 的 API 变动导致。

解决:先确认 3rdParty 里 GDAL 的具体版本,然后去 OSGEarth 的 CMake 选项里找有没有对应的开关。有些模块可以通过-DBUILD_OSGEARTH_GDAL=OFF暂时关掉,先让核心功能跑起来。

5.5 现象:Debug 配置下编译报一堆_ITERATOR_DEBUG_LEVEL不匹配

原因:3rdParty 里只有 Release 版的库,没有 Debug 版,但你在编 Debug。

解决:要么只编 Release,要么找一份带 Debug 库的 3rdParty。预编译包通常 Debug 和 Release 是分开的,下载时看清楚说明。

6. 验证跑通:用 osgViewer 和 osgearth_viewer 确认环境真的能用

装完不验证,等于没装。我一般会走两步:先用 OSG 自带的示例确认核心库没问题,再用 OSGEarth 的示例确认依赖链完整。

6.1 验证 OSG:跑一个最简单的场景

在OSG_Install/bin下应该有osgViewer.exe。准备一个最简单的.osg文件,或者直接用命令行加载一个模型:

cd D:\OSG_Workspace\OSG_Install\bin osgViewer.exe cow.osg

如果弹出一个窗口显示一头牛,说明 OSG 核心库、插件、DLL 路径都没问题。如果报错,重点看弹窗里缺的是哪个 DLL,回到第 5 章排查。

6.2 验证 OSGEarth:加载一个 earth 文件

OSGEarth 的示例程序是osgearth_viewer.exe。它需要一个.earth文件来描述图层。最简单的测试是加载一个本地影像:

cd D:\OSG_Workspace\OSGEarth_Install\bin osgearth_viewer.exe D:\test.earth

test.earth的内容可以极简:

<map name="test"> <image name="world" driver="gdal"> <url>D:\data\world.tif</url> </image> </map>

如果能看到地球影像,说明 GDAL 驱动、PROJ 坐标转换、OSG 渲染管线全部打通。这一步能跑通,整套环境就算真正落地了。

6.3 我自己的验证习惯

从那以后我每次装完 OSG 环境,都会强制走一遍osgViewer加载 cow.osg 和osgearth_viewer加载一个最小 earth 文件的流程。这两个动作花不了两分钟,但能提前暴露 90% 的 DLL 缺失和驱动配置问题。比起在项目里写到一半才发现环境有问题,这个习惯帮我省了太多返工时间。希望这套流程也能帮你顺利把 OSG 3.6.5 和 OSGEarth 跑起来。

本文还有配套的精品资源,点击获取

相关新闻

C# 调用佳能 EOS SDK 实现相机拍照与实时传输源码解析

C# 调用佳能 EOS SDK 实现相机拍照与实时传输源码解析

简介&#xff1a;这份资源面向使用 C# 开发相机控制程序的工程师与爱好者&#xff0c;基于 WinForms 编写&#xff0c;通过佳能 EOS SDK 实现相机拍照、实时传输等核心功能&#xff0c;并附带最新版 EOS SDK 组件&#xff0c;可直接用于二次开发或项目集成。压缩包共 1792 个文…

2026/10/20 6:57:46 阅读更多 →
MCP安全风险全解析:从接口统一到提示词注入的六大危机

MCP安全风险全解析:从接口统一到提示词注入的六大危机

我第一次意识到“接口统一”这件事的两面性&#xff0c;是在把一个MCP服务端接进内部Demo的那一刻。MCP&#xff0c;全称Model Context Protocol&#xff0c;模型上下文协议&#xff0c;正在成为AI生态里自带光环的通用接口&#xff0c;很多人直接叫它AI界的USB-C。这个比喻确实…

2026/10/20 6:56:45 阅读更多 →
微信小程序从零开发到上线:原生框架+云开发完整实践

微信小程序从零开发到上线:原生框架+云开发完整实践

先说结论&#xff1a;用微信原生框架从零开始写一个能正常上线的小程序&#xff0c;没有想象中那么玄乎&#xff0c;但也不会像看几分钟视频就能马上搞定那么容易。这篇文章我想用一个名字叫 WorkBuddy 的“工作辅助小程序”当例子&#xff0c;把从注册账号、安装开发者工具、创…

2026/10/20 6:56:45 阅读更多 →

最新新闻

CAT12 VBM全流程实战:从安装配置到多模态形态学建模

CAT12 VBM全流程实战:从安装配置到多模态形态学建模

简介&#xff1a;本资源是面向神经影像学研究者与计算神经科学初学者的CAT12工具箱完整安装与分析套件&#xff0c;专为基于体素的形态计量学&#xff08;VBM&#xff09;研究设计&#xff0c;解决sMRI数据预处理、组织分割、统计建模与结果可视化等核心问题。包内共518个文件&…

2026/10/20 7:59:20 阅读更多 →
Flutter 动画还能这么玩:从框架分析到渲染管线,性能翻倍的底层秘密

Flutter 动画还能这么玩:从框架分析到渲染管线,性能翻倍的底层秘密

Flutter 动画还能这么玩&#xff1a;从框架分析到渲染管线&#xff0c;性能翻倍的底层秘密 【免费下载链接】flutter Flutter makes it easy and fast to build beautiful apps for mobile and beyond 项目地址: https://gitcode.com/GitHub_Trending/flutter41/flutter …

2026/10/20 7:59:20 阅读更多 →
SecureCRT中文版深度适配原理与实战指南

SecureCRT中文版深度适配原理与实战指南

简介&#xff1a;SecureCRT中文版是一款面向网络工程师、系统管理员及Linux/Unix运维人员的免安装终端仿真工具&#xff0c;专为安全、高效地管理SSH远程服务器与网络设备而设计。资源包共198个文件&#xff0c;含15个可执行程序&#xff08;主程序及配套工具&#xff09;、52个…

2026/10/20 7:59:20 阅读更多 →
Matlab肌肉激活度计算:从sEMG信号到%MVC的完整实现

Matlab肌肉激活度计算:从sEMG信号到%MVC的完整实现

简介&#xff1a;这份资源面向运动生物力学、康复工程与人体运动分析方向的学习者和研究者&#xff0c;提供一套用Matlab求解肌肉激活度的完整实现方案&#xff0c;解决从表面肌电信号到激活度曲线这一环节缺少可运行参考代码的问题。压缩包共5个文件&#xff0c;约135KB&#…

2026/10/20 7:59:20 阅读更多 →
鄱阳湖水系shp数据在ArcGIS中的处理全流程:坐标系、属性表与出图

鄱阳湖水系shp数据在ArcGIS中的处理全流程:坐标系、属性表与出图

简介&#xff1a;长江流域鄱阳湖水系的地形图矢量资料&#xff0c;以通用的shp格式提供湖泊与河流要素&#xff0c;同时包含90米分辨率数字高程模型&#xff08;DEM&#xff09;和山体阴影栅格&#xff0c;并配有ArcGIS工程文件&#xff08;mxd&#xff09;&#xff0c;可直接用…

2026/10/20 7:59:20 阅读更多 →
Python数据分析与可视化源码包实战:从数据清洗到图表输出的完整链路拆解

Python数据分析与可视化源码包实战:从数据清洗到图表输出的完整链路拆解

简介&#xff1a;这份资源面向希望系统掌握Python数据分析与可视化的学习者&#xff0c;覆盖从编程基础到实战项目的完整技能链路&#xff0c;适合高校学生、转行者及需要处理结构化数据的从业者。压缩包共162个文件&#xff0c;约31.27MB&#xff0c;以67个ipynb实验代码、11个…

2026/10/20 7:58:20 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →