本篇适用于GDAL3.3的静态编译,环境请参照静态编译,此处就不重复了,此处只编了一些自用的库,如果有啥其他的,可以在issue里提,libpq之类的可以直接用编好的,更方便
- PROJ > 6
- SQLite3
- libtiff
- libzip(option)
- curl
- LIBICONV
- libtiff >= 4.0(option)
- Expat
- HDF4
- HDF5
- PostgreSQL
- SQLite Libraries
- libspatialite
- GEOS
- freexl
- proj
- sqlite3
- zlib
- iconv
- libxml2
- librttopo
- libcurl
- libtiff
- PCRE
- NETCDF4
- curl
- geos
- Podofo
- freetype
- tiff
- jpeg
- LZMA_CFLAGS
- ZSTD_LIBS
- TILEDB_LIBS
- RDB_LIB
- WEBP
- libxml2
- libiconv
- FREEXL
- libiconv
- heif
- libde265
解压后,按照Fix CMake install issue (#278) 修改cmake文件,然后编译
如果需要静态库,修改CMakeLists.txt里的_BUILD_SHARED_LIBS_参数即可
cd libde265-1.0.8
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/libde265_1.0.8_x64
cmake --build . --config Release --target install
依赖libde265 ,解压后
如果需要静态库,修改CMakeLists.txt里的_BUILD_SHARED_LIBS_参数即可
cd libheif-1.12.0
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/libheif_1_12_0_x64 -DLIBDE265_FOUND=ON -DLIBDE265_INCLUDE_DIR=e:/GDAL_BUILD/libde265_1.0.8_x64/include -DLIBDE265_LIBRARIES=e:/GDAL_BUILD/libde265_1.0.8_x64/lib/libde265.lib
cmake --build . --config Release --target install
libcurl更新比较快,1-2月更新一个版本,请选择最新的版本,可选 openssl
和
zlib
等库,自己参考winbuild下readme文档,最简单的编译方式如下:
cd winbuild
nmake /f Makefile.vc mode=static
生成文件将在 builds
文件夹下.需要自己拷贝出来,
在curl.h第一行添加
define CURL_STATICLIB
cmake,依然是修改CmakeList编译静态库
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/libtiff_4_3_0_x64
cmake --build . --config Release --target install
sqlite.cmake.build中的cmake文件可用
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/libsqlite3_36_x64
cmake --build . --config Release --target install
cmake编译
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/proj8_1_0_x64 -DBUILD_SHARED_LIBS=OFF -DEXE_SQLITE3=E:\GDAL_BUILD\libsqlite3_36_x64\bin\shell.exe -DSQLITE3_INCLUDE_DIR=E:\GDAL_BUILD\libsqlite3_36_x64\include -DSQLITE3_LIBRARY=E:\GDAL_BUILD\libsqlite3_36_x64\lib\sqlite3-static.lib -DCURL_INCLUDE_DIR=E:\GDAL_BUILD\libcurl-7.77.0-x64\include -DCURL_LIBRARY="E:\GDAL_BUILD\libcurl-7.77.0-x64\lib\libcurl_a.lib;wsock32.lib;wldap32.lib;winmm.lib" -DTIFF_INCLUDE_DIR=E:\GDAL_BUILD\libtiff_4_3_0_x64\include -DTIFF_LIBRARY_RELEASE=E:\GDAL_BUILD\libtiff_4_3_0_x64\lib\tiff.lib -DBUILD_TESTING=OFF
cmake --build . --config Release --target install
win下编译1.16版本的iconv,直接打开2017工程编译就行
下载源码后,修改 /lib/expat.h
文件,在文件首加上:
define XML_STATIC
打开命令行,使用cmake
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/liexpat_2_4_1_x64 -DBUILD_SHARED_LIBS=OFF
cmake --build . --config Release --target install
尽量使用4.2.12 之后版本,方便编译
直接下载cmake版本,注意是win还是其他,win下载zip压缩,其他下载tar.gz
最新是4.2.15版本,,下载CMake-hdf-4.2.15.zip
修改其中的 HDF4options.cmake 文件,文件末尾添加
set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF4_ENABLE_NETCDF:BOOL=OFF")
防止与 netcdf 库冲突
同时取消注释,编译静态库
set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
下载完成后,根据Visual Studio版本,运行相应的 build-VS20xx-32.bat
或者
build-VS20xx-64.bat
文件,会自动新建build文件夹,最终在 build
文件夹下生成zip文件.
老版本或者新版本的Visual Studio可直接编辑 HDF4config.cmake 文件,仿照其他bat文件写脚本.
基本与hdf4一样,下载cmake版本,修改HDF5options.cmake文件,取消注释,最后加上一行
set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
#add# at last
set (ADD_BUILD_OPTIONS ${ADD_BUILD_OPTIONS} -DDEFAULT_API_VERSION:STRING=v18")
即静态编译后,双击bat即可
注意:
hdf5需要加DEAFAULT_API_VESION=v18
改cmakelist.txt文件 : Use of unset variable HDF5_VERSION · Issue #1962 · Unidata/netcdf-c · GitHub (fastgit.org)
在utf8环境下编译
屏蔽掉
netcdf-c-4.8.0\nc_test4\tst_udf.c
中的19-26行/* #if# defined(_WIN32) || defined(_WIN64) int NC4_show_metadata(int ncid) { return 0; } #endif# */
编译
chcp 65001
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/netcdf_4_8_0_x64 -DBUILD_SHARED_LIBS=OFF -DUSE_SZIP=ON -DUSE_HDF5=ON -DENABLE_DAP=ON -D"SZIP=E:/GDAL_BUILD/HDF5-1.12.0-win64/lib/libszip.lib” -D"ZLIB_INCLUDE_DIR=E:/GDAL_BUILD/SOURCE/CMake-hdf5-1.12.0/build/ZLIB-prefix/src/ZLIB" -D"ZLIB_LIBRARY=E:/GDAL_BUILD/HDF5-1.12.0-win64/lib/libzlib.lib" -DENABLE_NETCDF_4=ON -D"CURL_LIBRARY=E:/GDAL_BUILD/libcurl-7.77.0-x64/lib/libcurl_a.lib;wsock32.lib;wldap32.lib;winmm.lib;crypt32.lib;Ws2_32.lib;Normaliz.lib" -D"CURL_INCLUDE_DIR=E:/GDAL_BUILD/libcurl-7.77.0-x64/include" -D"HAVE_HDF5_H=E:/GDAL_BUILD/HDF5-1.12.0-win64/include" -D"HDF5_INCLUDE_DIR=E:/GDAL_BUILD/HDF5-1.12.0-win64/include" -D"HDF5_C_LIBRARY=E:/GDAL_BUILD/HDF5-1.12.0-win64/lib/libhdf5.lib" -D"HDF5_HL_LIBRARY=E:/GDAL_BUILD/HDF5-1.12.0-win64/lib/libhdf5_hl.lib" -DBUILD_TESTING=OFF
cmake --build . --config Release --target install
新版本的 geos
直接采用 cmake
可以生成静态库和动态库。
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/GEOS_3_9_1_x64 -DBUILD_SHARED_LIBS=OFF
cmake --build . --config Release --target install
del cmakecache.txt
set FTDIR=E:/GDAL_BUILD/freetype_2.10.4_x64
set FTLIBDIR=E:/GDAL_BUILD/freetype_2.10.4_x64/release static/win64
set ZLIBDIR=E:/GDAL_BUILD/HDF5-1.12.0-win64
set TIFDIR=E:/GDAL_BUILD/libtiff_4_3_0_x64
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INCLUDE_PATH="%FTDIR%/include;%JPEGDIR%/include;%ZLIBDIR%/include;%TIFDIR%/include" -DCMAKE_LIBRARY_PATH="%FTLIBDIR%;%FTDIR%/lib;%ZLIBDIR%/lib;%TIFDIR%/lib" -DPODOFO_BUILD_SHARED:BOOL=FALSE -DFREETYPE_LIBRARY_NAMES=freetype -DZLIB_LIBRARY_NAMES=libzlib -DTIFF_LIBRARY_NAMES=libTiff -DZLIB_INCLUDE_DIR=%ZLIBDIR%/include -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/podofo_0_9_7_x64
cmake --build . --config Release --target install
可以直接下载编译好的2.10.4版本,其中有动态版本和静态版本,没有尝试编译
- 修改nmake.opt中的输出路径
- 修改makefile.vc中iconv库路径和头文件路径
nmake /f makefile.vc install
进入
win32
文件夹下,运行,注意编译静态库需要 static=yes 和 cruntime=/MT 同时设置cscript configure.js static=yes compiler=msvc prefix=E:\GDAL_BUILD\libxml2-2.9.12_x64 include=E:\GDAL_BUILD\iconv1.16\include lib=E:\GDAL_BUILD\iconv1.16\lib cruntime=/MT nmake /f Makefile.msvc nmake /f Makefile.msvc install
编译完成后,在头文件中定义 LIBXML_STATIC 宏
修改
makefile.vc
中的geos头文件和lib文件路径修改
nmake.opt
中的安装路径 INSTDIR下载 #25 - Handle missing 2 header files when compiling on Windows 中的两个文件
在makefile.vc中第20行添加
src\rtt_tpsnap.obj
下面编译spatialite需要在vs命令行中编译
nmake /f Makefile.vc nmake /f Makefile.vc install
cmake-hdf5里有压缩文件夹,可以直接解压编译,不需要重复下载
mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/zlib_x64
cmake --build . --config Release --target install
修改 gg_utf8.c
文件中72行,注释掉
extern const char *locale_charset (void);
替换为
include <localcharset.h>
修改nmake.opt 中的输出路径
修改makefile64.vc中头文件 -I和lib的路径,所有路径都得改,主要是头文件和lib这两段,请按实际情况修改
CFLAGS = /nologo -I.\src\headers -I.\src\topology -I. -IE:\GDAL_BUILD\proj8_1_0_x64\include -IE:\GDAL_BUILD\GEOS_3_9_1_x64\include -IE:\GDAL_BUILD\iconv1.16\include -IE:\GDAL_BUILD\freeXL1_0_6_X64\include -IE:\GDAL_BUILD\libcurl-7.77.0-x64\include -IE:\GDAL_BUILD\libtiff_4_3_0_x64\include -IE:\GDAL_BUILD\libsqlite3_36_x64\include -IE:\GDAL_BUILD\zlib_x64\include -IE:\GDAL_BUILD\libxml2-2.9.12_x64\include\libxml2 -IE:\GDAL_BUILD\librttopo1_1_0_x64\include $(OPTFLAGS)
...
spatialite_i.lib: $(LIBOBJ)
link /dll /out:$(SPATIALITE_DLL) \
/implib:spatialite_i.lib $(LIBOBJ) \
E:\GDAL_BUILD\proj8_1_0_x64\lib\proj.lib E:\GDAL_BUILD\GEOS_3_9_1_x64\lib\geos_c.lib E:\GDAL_BUILD\GEOS_3_9_1_x64\lib\geos.lib\
E:\GDAL_BUILD\freeXL1_0_6_X64\lib\freexl.lib E:\GDAL_BUILD\iconv1.16\lib\libiconv-static.lib \
E:\GDAL_BUILD\libsqlite3_36_x64\lib\sqlite3-static.lib E:\GDAL_BUILD\zlib_x64\lib\libzlib.lib \
E:\GDAL_BUILD\libxml2-2.9.12_x64\lib\libxml2_a.lib E:\GDAL_BUILD\librttopo1_1_0_x64\lib\librttopo.lib \
E:\GDAL_BUILD\libtiff_4_3_0_x64\lib\tiff.lib E:\GDAL_BUILD\libtiff_4_3_0_x64\lib\tiffxx.lib \ E:\GDAL_BUILD\libcurl-7.77.0-x64\lib\libcurl_a.lib wsock32.lib shell32.lib wldap32.lib winmm.lib crypt32.lib Ws2_32.lib Normaliz.lib Ole32.lib Advapi32.lib
然后
nmake /f Makefile.vc
nmake /f Makefile.vc install
拷贝sqlite3.h的头文件到include和include/spatialite 里备用
cd build
cmake -G "Visual Studio 15 2017 Win64" .. -DCMAKE_INSTALL_PREFIX=e:/GDAL_BUILD/PCRE_x64
cmake --build . --config Release --target install
pcre2在gdal中是无效的,注意,需要pcre1,但是已经不怎么维护了
修改nmake.opt,添加依赖和修改编译环境,然后运行
注意:
- 如果需要编HDF NETCDF等库的plugin模式,请编译动态库,不要静态库
- 注意依赖关系,libspatalite库的其他依赖,hdf和netcdf的其他依赖需要带上
- 注意头文件中静态宏的声明
- 编译gdal静态库的话,修改nmake.opt 设置
DLLBUILD=0
,静态库编译比较占空间,其实不太推荐,其他库都是静态,编出来gdal303.dll不到30M,lib 2M,总体30M,静态编出来的话lib接近300M,编出来的工具大概就是30M,总体接近1G,不过好处是干净,看着没啥依赖,请按实际需求进行编译 - 编译后,建议先设置PROJ_LIB环境变量,或者在代码中调用
OSRSetPROJSearchPaths
设置proj.db的路径,gdal3中主要变化一个是编译都升级到c++11,另一个就是proj库升级到6以上,支持WKT2了,不加上的话会出现找不到proj.db的错误