天天看點

Windows下編譯gdal3.7.1

作者:編譯小王子
GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協定下的開源栅格空間資料轉換庫。該項目由Frank Warmerdam教授于1998年發起。 它利用抽象資料模型來表達所支援的各種檔案格式。 它還有一系列指令行工具來進行資料轉換和處理。 OGR(OpenGIS Simple Features Reference Implementation)是GDAL項目的一個子項目,提供對矢量資料的支援。 一般把這兩個庫合稱為GDAL/OGR,或者簡稱為GDAL。這個庫是GIS、遙感系統開發必備神器。

一、編譯環境說明

  • 作業系統:Win11
  • 編譯器:Visual Studio 2019
  • CMake:3.27.0
  • gdal版本:3.7.1

二、依賴說明

因為gdal支援幾乎所有矢量、栅格檔案格式的讀寫和轉換,以及基礎的分析功能,是以依賴庫也是非常多。不過gdal對于編譯的支援也是非常貼心的,雖然多,但編譯起來也不算難。由于依賴實在太多,這裡就不一一列舉,隻列出核心依賴。

依賴項 版本
geos 3.12.0
proj 9.2.1
libtiff 4.5.0
libpng 1.6.37

以上除了GEOS和PROJ外部設定外,其他相應的讀寫庫其實gdal内部都包含了源碼(和相應的Driver一起),會和GDAL一起參與編譯。是以說雖然依賴多,但并不需要配置很多内容。如果你要特别替換其中的版本,例如替換libtiff最新版,那麼得手動将代碼全部替換,一般情況下不推薦這麼做。

三、編譯過程

1、源碼下載下傳

官方下載下傳位址:Download — GDAL documentation

2、編譯指令

直接上腳本吧:

@echo off

if defined PROGRAMFILES(X86) set PF86=%PROGRAMFILES(X86)%
if not defined PF86 set PF86=%PROGRAMFILES%
if not defined PF86 (echo PROGRAMFILES not set & goto error)

set PROJ_ROOT=D:\SourceCode\proj-9.2.1\prefix
set GEOS_ROOT=D:\SourceCode\geos-3.12.0\install
set OPENSSL_ROOT=D:\SourceCode\openssl-1.1.1t\prefix

set VCSDK=10.0.19041.0
set VCARCH=amd64

if not defined CC set CC=cl.exe
if not defined CXX set CXX=cl.exe
if not defined OSGEO4W_ROOT set OSGEO4W_ROOT=C:\OSGeo4W64

for %%e in (Community Professional Enterprise) do if exist "%PF86%\Microsoft Visual Studio\2019\%%e" set vcdir=%PF86%\Microsoft Visual Studio\2019\%%e
if not defined vcdir (echo Visual C++ not found & goto error)

set VS160COMNTOOLS=%vcdir%\Common7\Tools
call "%vcdir%\VC\Auxiliary\Build\vcvarsall.bat" %VCARCH% %VCSDK%
path %path%;%vcdir%\VC\bin

if exist "%PROGRAMFILES%\CMake\bin" path %PROGRAMFILES%\CMake\bin;%PATH%
if exist "%PF86%\CMake\bin" path %PF86%\CMake\bin;%PATH%

set LIB=%LIB%;%PROJ_ROOT%\lib;%GEOS_ROOT%\lib;%OPENSSL_ROOT%\lib
set INCLUDE=%INCLUDE%;%PROJ_ROOT%;%GEOS_ROOT%\include;%OPENSSL_ROOT%\include

goto end

:usage
echo usage: %0
exit /b 1

:error
echo ENV ERROR %ERRORLEVEL%: %DATE% %TIME%
exit /b 1

:end
cmake -DCMAKE_INSTALL_PREFIX=.\install -S . -B .\bld           

簡要說明:其中配置了PROJ、GEOS、OPENSSL的路徑就可以了。常用的編譯選項如下:

BUILD_APPS:是否編譯應用,即常用的工具,預設為ON

CMAKE_PREFIX_PATH:指定CMake搜尋外部子產品的位址

GDAL_BUILD_OPTIONAL_DRIVERS:編譯可選Drivers,預設是ON,如果您對于GDAL編譯出來的庫覺得太大,可以把該選項關閉,那麼GDAL就隻會編譯内置的,可選的就不編譯了

OGR_BUILD_OPTIONAL_DRIVERS:與上一個選項類似,不過這是控制OGR的

GDAL_ENABLE_DRIVER_<driver_name>和OGR_ENABLE_DRIVER_<driver_name>:若你想精确控制可選Driver是否編譯,可以通過該選項進行指定Driver,driver_name如下:

driver_name 說明
GDAL_ENABLE_DRIVER_RAW ACE2, BT, BYN, CPG, CTable2, DIPEx, DOQ1, DOQ2, EHDR, EIR, ENVI, FAST, GenBIN, GSC, GTX, MFF2, ISCE, KRO, MFF, LAN, LCP, LOSLAS, NDF, NTv2, PAUX, PNM, ROIPAC, RRASTER, SNODAS
GDAL_ENABLE_DRIVER_PDS PDS, PDS4, ISIS2, ISIS3, VICAR
GDAL_ENABLE_DRIVER_ECW ECW, JP2ECW
GDAL_ENABLE_DRIVER_EEDA EEDA, EEDAI
GDAL_ENABLE_DRIVER_GSG GSAG, GSBG, GS7BG
GDAL_ENABLE_DRIVER_HDF5 HDF5, BAG
GDAL_ENABLE_DRIVER_MRSID MrSID, JP2MrSID
GDAL_ENABLE_DRIVER_NITF NITF, RPFTOC, ECRGTOC
GDAL_ENABLE_DRIVER_NORTHWOOD NWT_GRD, NWT_GRC
GDAL_ENABLE_DRIVER_ADRG SRP, ADRG
GDAL_ENABLE_DRIVER_ILI Interlis 1, Interlis 2
GDAL_ENABLE_DRIVER_WFS WFS, OAPIF
GDAL_ENABLE_DRIVER_AVC AVCBIN, AVCE00
GDAL_ENABLE_DRIVER_DWG DWG, DGNv8
GDAL_ENABLE_DRIVER_AIGRID AIG
GDAL_ENABLE_DRIVER_ENVISAT ESAT
GDAL_ENABLE_DRIVER_GEOR GeoRaster
GDAL_ENABLE_DRIVER_IDRISI RST
OGR_ENABLE_DRIVER_ELASTIC ElasticSearch
OGR_ENABLE_DRIVER_PG PostgreSQL
OGR_ENABLE_DRIVER_NTF UK .NTF
OGR_ENABLE_DRIVER_CAD CAD
GDAL_ENABLE_DRIVER_NETCDF netCDF
GDAL_ENABLE_DRIVER_PDF PDF
OGR_ENABLE_DRIVER_GPKG GPKG
OGR_ENABLE_DRIVER_NGW NGW
OGR_ENABLE_DRIVER_SQLITE SQLite

GDAL_USE_EXTERNAL_LIBS:預設ON,如果設定為OFF,則所有外部指定依賴都将失效,不過也可以通過GDAL_USE_<Packagename_in_upper_case>選項單獨配置,這對于需要指定特定依賴庫版本時特别有用。于此相反,還有個GDAL_USE_INTERNAL_LIBS選項,與之相反。

四、編譯可能出現的錯誤

1、error LNK2019: 無法解析的外部符号 EVP_PKEY_size

正在建立庫 D:/SourceCode/gdal-3.7.1/bld/RelWithDebInfo/gdal.lib 和對象 D:/SourceCode/gdal-3.7.1/bld/RelWithDebInfo/gdal.exp161>cpl_sha256.obj : error LNK2019: 無法解析的外部符号 EVP_PKEY_size,函數 CPL_RSA_SHA256_Sign 中引用了該符号161>D:\SourceCode\gdal-3.7.1\bld\RelWithDebInfo\gdal.dll : fatal error LNK1120: 1 個無法解析的外部指令           

這是個連結錯誤,無法找到EVP_PKEY_size函數。這個函數是OpenSSL庫的,一開始編譯時,使用的是OpenSSL3.1.1,是以可能是版本太高了,這個函數更名或被移除了。 解決方法有二:

方法一:隻需要變更為OpenSSL1.1.1即可

方法二:将GDAL_USE_OPENSSL選項設定為OFF

五、小結

趕快動動你的小手編起來,如果你實在懶,小編提供了下載下傳連結,關注同名GZH回複gdal即可獲得。

繼續閱讀