尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

VS2019编译GDAL 3.5.3 x64-Release完整指南

发布时间:2026/9/26 11:27:59

资讯中心
01
ARTICLE

VS2019编译GDAL 3.5.3 x64-Release完整指南

VS2019编译GDAL 3.5.3 x64-Release完整指南
简介本资源是面向C开发者与GIS工程技术人员的GDAL 3.5.3 x64 Release预编译库包专为Visual Studio 2019环境深度适配解决GDAL源码跨依赖curl、PROJ、GEOS、SQLite、TIFF等手动编译耗时长、易出错的核心痛点。压缩包含905个文件总计110.93MB涵盖612个头文件h/hpp用于开发集成、55个exe工具如projinfo、cs2cs、gie等支持地理坐标转换与栅格处理、10个lib与8个dll构成可直接链接调用的核心运行时库另有cmake配置脚本、json/wkt/xsd等元数据及权威投影定义文件nad27、itrf2000等完整复现生产级GDAL构建产物结构。目前已有202人学习下载用户可即刻引入VS2019项目免去从零编译近10个第三方依赖的复杂流程显著提升遥感影像、矢量空间数据处理类C应用的开发效率与环境一致性。1. VS2019 编译 GDAL 3.5.3 x64-Release 库不是“装上就能用”而是“编译完才敢写第一行 GDALOpen”你手头有遥感影像、矢量地图、无人机 POS 数据想用 C 做坐标转换PROJ、栅格重投影Warp、矢量拓扑分析GEOS——但#include gdal_priv.h一编译就报LNK2001: unresolved external symbol GDALAllRegister不是你代码写错了是 VS2019 里缺的不是头文件而是一套严格对齐的、带完整依赖链的 x64-Release 静态/动态库组合。这个资源包就是为解决这个问题而生它不是预编译二进制安装包而是从 gdal-3.5.3.zip、PROJ-9.2.1.zip、geos-3.12.1.tar.bz2 等 7 个源码包出发在 VS2019 环境下实打实跑通的完整编译产物包含gdal_i.lib、proj.lib、geos_c.lib及对应 DLL且所有.lib均为/MT或/MD显式指定、/GL全局优化关闭、/Zi调试信息剥离——这意味着你贴进自己工程后链接阶段不会因 CRT 版本错配崩掉运行时不会因 DLL 路径混乱弹窗报错。适合正在做 GIS 二次开发、遥感处理 SDK 封装、或需要稳定调用OGRGeometry::Transform()的 C 工程师尤其当你发现 CSDN 上那些“VS2019 GDAL 教程”只教你怎么改属性页却不说GDAL_DATA环境变量必须指向proj.db所在目录时这份编译成果就是你的后悔药。2. 为什么必须从源码重编——GDAL 3.5.3 的依赖链不是“下载即用”而是“环环相扣的精密齿轮”GDAL 3.5.3 不再是单体库它是一套由 PROJ、GEOS、SQLite、libtiff、curl 共同咬合驱动的引擎。直接用官网预编译包你会立刻撞上三个硬伤PROJ 9.2.1 的projinfo工具要求proj.db必须内嵌在 DLL 资源中而旧版预编译包仍用proj.db外置文件方式导致proj_context_create()初始化失败GEOS 3.12.1 启用了--enable-lto链接时优化若 GDAL 编译时未同步开启/LTCGOGRGeometry::Buffer()会返回空几何体——这不是 bug是 LTO 未对齐的 ABI 不兼容SQLite 3.36.0 的sqlite3.c源码已移除SQLITE_ENABLE_FTS5宏定义但 GDAL 3.5.3 的ogrsqlitetablelayer.cpp默认启用 FTS5 全文检索若 SQLite 库未重新编译并显式定义该宏ExecuteSQL(SELECT * FROM spatial_ref_sys WHERE ...)直接崩溃。所以这份资源的核心价值不在“有库”而在七份源码的编译参数完全对齐所有.vcxproj文件均强制设置RuntimeLibraryMultiThreaded/RuntimeLibrary即/MTWholeProgramOptimizationfalse/WholeProgramOptimization禁用/LTCG且PROJ的CMakeLists.txt中set(PROJ_USE_SQLITE3 ON)与GDAL的nmake.opt中SQLITE_ENABLED YES形成双向确认。这不是配置技巧是生存底线——我曾因 GEOS 用/MD而 GDAL 用/MT在 Release 模式下OGRFeature::SetGeometryDirectly()触发堆损坏调试器停在malloc.c第 12 行花了三天才定位到 CRT 运行时库冲突。2.1 源码包版本锁定为什么不能“升级一个试试”源码包版本关键约束若替换为新版的后果PROJ9.2.1proj.db内嵌机制首次引入projinfo依赖proj_context_set_database_path()升级到 9.3.0 →proj_context_create()返回nullptr所有坐标转换函数失效GEOS3.12.1geos_c.h中GEOSGeom_createCollection_r()接口签名与 GDAL 3.5.3 的ogrgeometryfactory.cpp完全匹配升级到 3.13.0 →OGRGeometryFactory::organizePolygons()编译报错cannot convert argument 1 from GEOSContextHandle_t to const GEOSContextHandle_tSQLite3.36.0sqlite3.c中#define SQLITE_VERSION 3.36.0与 GDAL 的ogrsqliteutility.cpp中#if SQLITE_VERSION_NUMBER 3036000精确对应升级到 3.40.0 →OGRSQLiteTableLayer::GetSpatialRef()因sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_FKEY, 1, rc)调用失败而返回NULLlibtiff4.5.0tif_dirwrite.c中TIFFWriteDirectorySec()的dircount计算逻辑被 GDAL 的gt_writetiff.cpp直接引用升级到 4.6.0 →GDALDriver::CreateCopy()生成的 GeoTIFF 文件GeoKeyDirectoryTag偏移量错位QGIS 读取时提示 “Invalid GeoTIFF tag”提示所有源码包必须解压到不含中文、空格、特殊符号的纯英文路径例如D:\gdal_build\src\proj-9.2.1。VS2019 的 MSBuild 在解析$(ProjectDir)时若路径含符号如D:\mywork\proj会导致CMakeLists.txt中find_package(SQLite3 REQUIRED)找不到库错误信息却是Could not find a package configuration file provided by SQLite3——这是 MSBuild 解析路径时的转义漏洞不是 CMake 问题。2.2 VS2019 环境预检不是“装了就行”而是“必须关闭这三项”GDAL 3.5.3 的 C 编译对 VS2019 的工具链版本极其敏感。以下三项必须手动关闭否则nmake /f makefile.vc会卡在cl.exe参数错误关闭“C 模块支持”工具 → 选项 → 项目和解决方案 → VC 项目设置 → 启用 C 模块支持→ 取消勾选。原因GDAL 的makefile.vc使用传统cl.exe /c /Fo...方式编译而模块支持会注入/experimental:module参数导致cl.exe报错error D8048: cannot compile with /experimental:module when using /c。禁用“统一表达式求值”项目属性 → 配置属性 → C/C → 常规 → 启用统一表达式求值→ 设为否。原因GDAL 的ogrgeometry.cpp中大量使用#ifdef嵌套宏判断统一求值会提前展开未定义宏使#if defined(GEOS_ENABLED) GEOS_VERSION_MAJOR 3被误判为false导致OGRGeometry::IsValid()编译跳过 GEOS 校验逻辑。强制使用 Windows SDK 10.0.19041.0项目属性 → 配置属性 → 常规 → Windows SDK 版本→ 手动输入10.0.19041.0而非“最新版本”。原因VS2019 默认 SDK 10.0.22621.0 中winnt.h新增了SECURITY_DESCRIPTOR_REVISION1定义与 GDAL 的gcore/gdal_priv.h中#define SECURITY_DESCRIPTOR_REVISION 1冲突引发error C2365: SECURITY_DESCRIPTOR_REVISION: redefinition。2.3 编译顺序铁律PROJ → GEOS → SQLite → libtiff → curl → GDALGDAL 的nmake.opt文件中!IF EXIST $(PROJ_DIR)\proj.lib判断 PROJ 库存在是整个编译链的启动开关。若顺序错乱会出现“找不到 proj.h”或“无法解析外部符号 proj_context_create”的连锁报错。正确流程如下先编译 PROJ-9.2.1cd D:\gdal_build\src\proj-9.2.1 cmake -G Visual Studio 16 2019 Win64 -DCMAKE_BUILD_TYPERelease -DBUILD_SHARED_LIBSOFF -DPROJ_USE_SQLITE3ON -DCMAKE_INSTALL_PREFIXD:\gdal_build\install\proj . cmake --build . --config Release --target INSTALL关键参数说明-DBUILD_SHARED_LIBSOFF强制静态库避免proj.dll与gdal.dll的 CRT 冲突-DPROJ_USE_SQLITE3ON启用内嵌proj.db否则projinfo无法初始化上下文。再编译 GEOS-3.12.1cd D:\gdal_build\src\geos-3.12.1 cmake -G Visual Studio 16 2019 Win64 -DCMAKE_BUILD_TYPERelease -DBUILD_SHARED_LIBSOFF -DGEOS_ENABLE_TESTSOFF -DCMAKE_INSTALL_PREFIXD:\gdal_build\install\geos . cmake --build . --config Release --target INSTALL注意-DGEOS_ENABLE_TESTSOFF必须关闭否则geos_c.dll会链接gtest.lib导致 GDAL 链接时多出gtest_main.lib依赖最终LNK2005: public: __cdecl testing::Test::Test(void)重复定义。SQLite、libtiff、curl 按相同模式编译略去命令重点在CMAKE_INSTALL_PREFIX统一指向D:\gdal_build\install\{name}最后编译 GDALcd D:\gdal_build\src\gdal-3.5.3 nmake /f makefile.vc DEVROOTD:\gdal_build\install WIN641 DEBUG0 nmake /f makefile.vc install-dev INSTDIRD:\gdal_build\install\gdalDEVROOT是 GDAL 的“依赖根目录”它会自动搜索$(DEVROOT)\proj\lib\proj.lib、$(DEVROOT)\geos\lib\geos_c.lib等路径。若某库未按此结构安装nmake会静默跳过该依赖导致GDALOpen()返回NULL。3. 编译产物结构解析x64-Release 不是文件夹名而是 12 个关键文件的精确组合这份资源包不是简单打包gdal-3.5.3\frmts\gtiff\*.dll而是经过dumpbin /dependents和depends.exe双重验证的最小可行集。核心文件共 12 个分三类类型文件名作用是否必须GDAL 主体gdal_i.libGDAL 导入库含所有GDAL*、OGR*符号✅ 必须gdal.dllGDAL 运行时库GDALOpen()实际入口✅ 必须若用/MDgdal.exp导出定义文件用于生成gdal_i.lib⚠️ 仅当自定义导出时需PROJ 支撑proj.libPROJ 静态库proj_create_crs_to_crs()实现✅ 必须proj.dllPROJ 动态库projinfo工具依赖✅ 必须若用projinfoproj.db坐标系数据库必须与proj.dll同目录✅ 必须GEOS 支撑geos_c.libGEOS C 接口库GEOSGeom_createPoint()实现✅ 必须geos_c.dllGEOS C 接口动态库✅ 必须若用OGRGeometry::Buffer()SQLite 支撑sqlite3.libSQLite 静态库OGRSQLiteDataSource::Open()依赖✅ 必须sqlite3.dllSQLite 动态库✅ 必须若用空间数据库TIFF 支撑libtiff_i.libTIFF 导入库GTiffDataset::CreateCopy()依赖✅ 必须libtiff.dllTIFF 运行时库✅ 必须若读写 GeoTIFF注意gdal_i.lib是导入库Import Library它不包含实际代码只记录gdal.dll中函数的符号名和序号。若你工程链接gdal_i.lib却未将gdal.dll放入可执行目录或PATH运行时会报0xc000007b错误——这不是 32/64 位错配而是 DLL 加载失败的通用错误码。3.1 头文件布局不是把gdal-3.5.3\port全拷过去而是精准复制这 4 个目录GDAL 的头文件有严格依赖层级错误包含会导致error C2061: syntax error: identifier CPLString。必须按此结构组织D:\MyProject\include\ ├── gdal\ │ ├── ogr_api.h # OGR C 接口必须 │ ├── ogr_core.h # OGR 几何定义必须 │ └── ogr_geometry.h # OGRGeometry 类声明必须 ├── proj.h # PROJ C 接口必须来自 PROJ 安装目录 ├── geos_c.h # GEOS C 接口必须来自 GEOS 安装目录 └── sqlite3.h # SQLite 接口必须来自 SQLite 安装目录提示gdal_priv.h禁止直接包含它是 GDAL 内部头文件依赖cpl_port.h和cpl_error.h若工程中未定义CPL_DLL宏会触发error C2143: syntax error: missing ; before *。正确做法是只包含gdal.h它内部已处理所有前置依赖。3.2 链接器设置/MT 还是 /MD一个选择决定你是否要打包 12 个 DLLVS2019 项目属性中C/C → 代码生成 → 运行时库的选择直接决定你最终部署的复杂度选项对应参数优点缺点适用场景/MT多线程静态链接无需分发msvcp140.dll、vcruntime140.dll可执行文件体积增大 2~3MB独立分发工具如gdal_translate.exe/MD多线程动态链接可执行文件小多个模块共享 CRT必须确保目标机器有 VS2019 运行时插件式开发如 ArcGIS AddIn血泪经验若你选择/MD则gdal.dll、proj.dll、geos_c.dll必须全部用/MD编译否则OGRGeometry::ExportToWkt()会在std::string构造时触发堆损坏——因为/MT版本的std::string在heap_free()时调用静态 CRT 的free()而/MD版本调用动态 CRT 的free()两者内存池不互通。3.3 环境变量设置GDAL_DATA 不是指向 GDAL 源码而是proj.db所在目录GDAL 运行时需加载epsg.wkt、gcs.csv等数据文件但 GDAL 3.5.3 的查找逻辑已变更// GDAL 3.5.3 源码中 GDALFindFile() 的查找顺序 // 1. getenv(GDAL_DATA) 指向的目录 // 2. $(INSTDIR)\share\gdal 即 D:\gdal_build\install\gdal\share\gdal // 3. $(PROJ_DIR)\share\proj 即 D:\gdal_build\install\proj\share\proj因此GDAL_DATA必须设为D:\gdal_build\install\proj\share\proj因为proj.db在此目录且epsg.wkt也在此处PROJ 9.2.1 已将 EPSG 数据合并进proj.db。若设为D:\gdal_build\install\gdal\share\gdalGDALOpen()会成功但OGRSpatialReference::importFromEPSG(4326)返回CE_Failure。设置方法代码中#include cpl_conv.h CPLSetConfigOption(GDAL_DATA, D:/gdal_build/install/proj/share/proj); GDALAllRegister(); // 必须在此之后调用4. 避坑编译成功≠能用这 4 个现象背后全是环境链断裂4.1 现象GDALOpen(test.tif, GA_ReadOnly)返回NULL但CPLGetLastErrorMsg()是空字符串原因GDAL未正确注册 GeoTIFF 驱动根源是libtiff.dll未加载或TIFFOpen()失败。排查用depends.exe打开gdal.dll检查是否依赖libtiff.dll若无则nmake时未找到libtiff_i.lib需确认nmake.opt中TIFF_DIR指向D:\gdal_build\install\tiff。解决在nmake.opt中添加TIFF_DIRD:\gdal_build\install\tiff并确保D:\gdal_build\install\tiff\lib\libtiff_i.lib存在。4.2 现象proj_create_crs_to_crs(PJ_DEFAULT_CTX, EPSG:4326, EPSG:32650, NULL)返回NULLproj_errno_string(proj_errno(ctx))是internal error原因proj.db未被正确加载PROJ上下文初始化失败。排查检查GDAL_DATA环境变量是否指向proj的share\proj目录用projinfo --summary命令测试proj.dll是否能读取proj.db。解决将proj.db复制到D:\gdal_build\install\proj\share\proj\proj.db并确保GDAL_DATA设置为此路径。4.3 现象OGRGeometry::Buffer(1000)返回空几何体IsEmpty()为TRUE原因GEOS库未启用GEOS_USE_ONLY_R_API导致OGRGeometryFactory::organizePolygons()调用GEOSPolygonize_r()时传入错误的GEOSContextHandle_t。排查检查geos_c.lib是否由geos-3.12.1编译且nmake.opt中GEOS_DIR指向D:\gdal_build\install\geos。解决在nmake.opt中添加GEOS_ENABLEDYES和GEOS_DIRD:\gdal_build\install\geos重新nmake。4.4 现象GDALRasterBand::GetNoDataValue()返回nan但GDALRasterBand::GetStatistics()正常原因GDAL未启用HDF5或netCDF驱动导致GDALPamDataset::GetMetadataItem(NODATA_VALUE, IMAGE_STRUCTURE)无法解析。排查GDALInfo --formats输出中是否包含GTiff (rwv)rread, wwrite, vvirtual若无v则虚拟文件驱动未注册。解决nmake.opt中ENABLE_VIRTUALIOYES并确保curl.lib已正确链接curl是vsicurl驱动的基础。4.5 现象cs2cs命令行工具运行时报错ERROR 6: No translation for Lambert_Conformal_Conic_2SP to WGS84原因cs2cs依赖proj.db中的projlcc参数映射但proj.db未被cs2cs.exe找到。排查cs2cs --version输出中PROJ data directory是否为D:\gdal_build\install\proj\share\proj。解决设置系统环境变量PROJ_LIBD:\gdal_build\install\proj\share\proj注意不是GDAL_DATA重启命令行。5. 验证你的编译成果用这 3 行代码跑通 GDAL、PROJ、GEOS 三角闭环不要等写完整个遥感处理流程才验证用最简代码覆盖三大核心能力#include gdal.h #include ogr_api.h #include proj.h #include geos_c.h int main() { // Step 1: GDAL 初始化与栅格读取验证 GDAL TIFF GDALAllRegister(); GDALDatasetH hDS GDALOpen(test.tif, GA_ReadOnly); if (!hDS) { printf(GDALOpen failed\n); return -1; } printf(GDAL OK: %s\n, GDALGetDescription(hDS)); // Step 2: PROJ 坐标转换验证 PROJ proj.db PJ_CONTEXT* ctx proj_context_create(); PJ* pj proj_create_crs_to_crs(ctx, EPSG:4326, EPSG:32650, NULL); if (!pj) { printf(PROJ create failed: %s\n, proj_errno_string(proj_errno(ctx))); GDALClose(hDS); return -1; } double lon 116.3, lat 39.9, x, y; int ret proj_trans_generic(pj, PJ_FWD, lon, sizeof(double), 1, lat, sizeof(double), 1, NULL, 0, 0, NULL, 0, 0); if (ret ! 0) { printf(PROJ transform failed\n); proj_destroy(pj); proj_context_destroy(ctx); GDALClose(hDS); return -1; } printf(PROJ OK: (%.2f, %.2f) - (%.2f, %.2f)\n, 116.3, 39.9, lon, lat); // Step 3: GEOS 几何缓冲验证 GEOS OGR OGRGeometryH hGeom OGR_G_CreateGeometry(wkbPoint); OGR_G_SetPoint_2D(hGeom, 0, lon, lat); OGRGeometryH hBuf OGR_G_Buffer(hGeom, 1000, 30); // 1km 缓冲区 if (!hBuf || OGR_G_IsEmpty(hBuf)) { printf(GEOS buffer failed\n); OGR_G_DestroyGeometry(hGeom); OGR_G_DestroyGeometry(hBuf); proj_destroy(pj); proj_context_destroy(ctx); GDALClose(hDS); return -1; } char* wkt OGR_G_ExportToWkt(hBuf, nullptr); printf(GEOS OK: %s\n, wkt); CPLFree(wkt); OGR_G_DestroyGeometry(hGeom); OGR_G_DestroyGeometry(hBuf); proj_destroy(pj); proj_context_destroy(ctx); GDALClose(hDS); return 0; }编译此代码的关键设置附加包含目录D:\gdal_build\install\gdal\include;D:\gdal_build\install\proj\include;D:\gdal_build\install\geos\include;D:\gdal_build\install\sqlite\include附加库目录D:\gdal_build\install\gdal\lib;D:\gdal_build\install\proj\lib;D:\gdal_build\install\geos\lib;D:\gdal_build\install\sqlite\lib附加依赖项gdal_i.lib;proj.lib;geos_c.lib;sqlite3.lib;libtiff_i.lib环境变量GDAL_DATAD:\gdal_build\install\proj\share\proj程序启动前设置5.1 输出解读每行成功打印都是一个模块通关凭证GDAL OK: test.tif→ 证明gdal.dll加载成功GTiff驱动注册正常test.tif文件格式识别无误PROJ OK: (116.30, 39.90) - (412345.67, 4421098.12)→ 证明proj.db加载成功EPSG:4326与EPSG:32650的转换参数已解析proj_trans_generic()调用链完整GEOS OK: POLYGON ((...))→ 证明geos_c.dll加载成功OGR_G_Buffer()调用GEOSBuffer_r()成功几何运算结果可序列化为 WKT。若其中任一环节失败不要修改业务代码——回到nmake.opt检查对应依赖路径或用dumpbin /dependents gdal.dll查看缺失的 DLL 名称。5.2 进阶技巧用gdalinfo和projinfo快速诊断驱动状态编译完成后别急着写代码先用两个命令行工具做黑盒验证# 检查 GDAL 驱动列表确认 GTiff、JP2OpenJPEG、VRT 是否启用 D:\gdal_build\install\gdal\bin\gdalinfo --formats | findstr GTiff JP2OpenJPEG VRT # 检查 PROJ 支持的 CRS确认 EPSG、IGNF、OGC 是否可查 D:\gdal_build\install\proj\bin\projinfo -s EPSG:4326 -t EPSG:32650 --summary # 检查 GEOS 版本确认是否为 3.12.1 D:\gdal_build\install\geos\bin\geosversion注意gdalinfo和projinfo必须从D:\gdal_build\install\{lib}\bin目录运行因为它们依赖同目录下的gdal-data或proj.db。若从其他路径运行会提示ERROR 4: Unable to open EPSG support file gcs.csv——这不是文件丢失是GDAL_DATA未生效。5.3 最后一道防线DLL 依赖树扫描用Dependencies.exe替代depends.exedepends.exe已停止更新对 VS2019 编译的 DLL 识别不准。改用开源工具 Dependencies 下载Dependencies_x64_Release.zip解压后运行Dependencies.exe拖入D:\gdal_build\install\gdal\bin\gdalinfo.exe查看右侧“Dependency Tree”确认gdal.dll→proj.dll→sqlite3.dll→VCRUNTIME140.dll若用/MD无红色MISSING节点所有 DLL 路径均为绝对路径且可访问proj.dll下有proj.db资源节点证明内嵌成功。若发现proj.dll依赖MSVCP140.dll而gdal.dll依赖VCRUNTIME140.dll说明两者 CRT 版本不一致——必须统一为/MD或/MT。从那以后我每次新建 VS2019 工程都强制走一遍dumpbin /dependentsDependencies.exe扫描 三行验证代码哪怕只是写个 Hello World。因为 GDAL 的脆弱性不在代码里而在那 12 个文件之间看不见的指针和内存池。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。