• gdal3.1.0+VS2017+geos+kml编译总结


    1、简介

    gdal3.1.0编译过程中必须依赖proj,编译gdal必须要编译proj,proj的编译需要sqlite3,因此想要编译gdal3.1.0需要先编译proj和sqlite3

    2、关于sqlite3

    版本3.32,它是一个小型的数据库,其官网上也提供了其动态库包和源代码,但是动态库没有lib文件,根据网上的教程我的编译过程如下:

    下载:sqlite-amalgamation-3320100.zip(sqlite3ext.h,sqlite3.h,sqlite3.c, shell.c)

         sqlite-dll-win64-x64-3320100.zip(sqlite3.dll, sqlite3.def)

    两个文件,使用vs将sqlite3ext.h,sqlite3.h,sqlite3.c和sqlite3.def加入到工程里面,并对工程做如下配置:

    1)预处理器

    增加如下宏

    _USRDLL

    SQLITE_ENABLE_RTREE

    SQLITE_ENABLE_COLUMN_METADATA

    SQLITE_ENABLE_FTS5

    SQLITE_ENABLE_FTS3

    SQLITE_ENABLE_UNLOCK_NOTIFY

    SQLITE_ENABLE_DESERIALIZE

    SQLITE_ENABLE_SERIALIZE

    2)模块定义文件 sqlite3.def

     

    3)在sqlite3.def增加一行

    sqlite3_unlock_notify

    完成这样的配置后既可以生成静态库,也可以生成动态库,同时如果加上shell.c文件可以生成sqlite.exe文件,据此我生成了proj所需要的

    include  sqlite3.h、sqlite3ext.h

    bin  SQLite3.exe

    lib  SQLite3.lib

    3、关于proj

    版本6.01,新版的proj4(官方说这个项目虽然升级了,但还是叫proj4),相对于旧的版本,已经有很大的变化了。因为它使用了sqlite3文件来存储各种坐标系统的定义等信息,所以必须依赖sqlite3,使用CMAKE编译,首先配置CMAK

    主要配置了include、exe、lib和安装目录,同时编译过程中会下载gtest,由于在内网编译,我首先下载了gtest放到了

    D:gdalPROJ-6.1uildgoogletest-downloadgoogletest-prefixsrc

    目录下面,完成了cmake的配置,随后启动vs的64位控制台,切换到目标路径,输入:

    msbuild ALL_BUILD.vcxproj /p:configuration="Release"

    msbuild INSTALL.vcxproj /p:configuration="Release"

    完成了proj4的编译,但是好像只能进行静态编译,动态编译会有问题,随后如果需要动态编译结果还需要回来做动态编译库。

    补充:关于编译动态库需要配置BUILD_LIBPROJ_SHARED 为true才可以

    4、编译GEOS

    使用版本3.4.0,在nmake.opt中配置

    GEOS_MSVC = 14.10

    GEOS_MSC = 1910

    nmake /f makefile.vc (BUILD_DEBUG=1如果debug模式的话)

    5、增加KML编译选项

    编译过程中发现需要增加libkml的选项,在github里面下载了libkml的三方库(其实最终用的是libkml-windev这个分支),按照教程进行了静态库的编译,由于构建这个库的VS工程比较老了,所以我先升级为vs2010编译成功后,再生成vs2017,后面可以直接打开主目录下的libkml.sln即可编译。

    编译完成后发现LIBKML数据一直识别不了,一直找不到原因,后面我把整个gdal清空了

    nmake /f makefile.vc clean

    然后就能编译了,但是编译过程发现了跟expat相关的一系列链接错误无法找到一些链接符号,我又下载了最新的expat版本,重新编译了一下,关于这方面的错误就没有了,但是还有关于uriparser的链接错误,也是找不到链接符号,又用vs2017重新编译了这个库,替换了静态lib,然后就编译成功了。

    下载编译zlib的库

    编译ThirdParty的minizlib

    最终整理,需要重新编译生成,好像gdal需要的minizip.lib并没有用到

    uriparser.lib, libexpat.lib, minizip_static.lib, zlibwapi.lib

    zlibwapi.dll, libexpat.lib

    6、编译gdal

    1)在nmake.opt里面进行编译设置

    # WIN64=YES  取消#编译64位

    MSVC_VER=1910  使用vs2017

    GDAL_HOME设置安装路径

    DLLBUILD=1 为动态编译   0位静态编译

    PROJ_INCLUDE/PROJ_LIBRARY 设置proj路径

    SQLITE_INC/SQLITE_LIB 设置sqilite路径

    2)GEOS设置:

    # Uncomment for GEOS support (GEOS >= 3.1.0 required)

    #GEOS_DIR=C:/warmerda/geos

    #GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOS

    #GEOS_LIB     = $(GEOS_DIR)/source/geos_c_i.lib

    GEOS_DIR=D:gdalgeos-3.4.0

    GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/include -DHAVE_GEOS

    GEOS_LIB     = $(GEOS_DIR)/src/geos_c_i.lib

    3) libkml设置

    # Uncomment out the following lines to enable LibKML support.

    #LIBKML_DIR = C:/Dev/libkml

    #LIBKML_INCLUDE = -I$(LIBKML_DIR)/src -I$(LIBKML_DIR)/third_party/boost_1_34_1

    #LIBKML_LIBRARY = $(LIBKML_DIR)/msvc/Release

    #LIBKML_LIBS =    $(LIBKML_LIBRARY)/libkmlbase.lib

    #            $(LIBKML_LIBRARY)/libkmlconvenience.lib

    #            $(LIBKML_LIBRARY)/libkmldom.lib

    #            $(LIBKML_LIBRARY)/libkmlengine.lib

    #            $(LIBKML_LIBRARY)/libkmlregionator.lib

    #            $(LIBKML_LIBRARY)/libkmlxsd.lib

    #            $(LIBKML_LIBRARY)/minizip_static.lib

    #            $(LIBKML_DIR)/third_partyexpat.win32/libexpat.lib

    #            $(LIBKML_DIR)/third_partyuriparser-0.7.5.win32/release/uriparser.lib

    #            $(LIBKML_DIR)/third_partyzlib-1.2.3.win32/lib/minizip.lib

    #            $(LIBKML_DIR)/third_partyzlib-1.2.3.win32/lib/zlib.lib

    LIBKML_DIR = D:/gdal/libkml-windev

    LIBKML_INCLUDE=-I$(LIBKML_DIR)/src I$(LIBKML_DIR)/third_party/boost_1_34_1

    LIBKML_LIBRARY = $(LIBKML_DIR)/x64/Release

    LIBKML_LIBS =      $(LIBKML_LIBRARY)/libkmlbase.lib

                  $(LIBKML_LIBRARY)/libkmlconvenience.lib

                  $(LIBKML_LIBRARY)/libkmldom.lib

                  $(LIBKML_LIBRARY)/libkmlengine.lib

                  $(LIBKML_LIBRARY)/libkmlregionator.lib

                  $(LIBKML_LIBRARY)/libkmlxsd.lib

                  $(LIBKML_LIBRARY)/minizip_static.lib

                  $(EXPAT_LIB)

                  $(LIBKML_DIR)/third_party/uriparser-0.7.5.win32/release/uriparser.lib

                  $(LIBKML_DIR)/third_party/zlib-1.2.3.win32/lib/minizip.lib

                  $(LIBKML_DIR)/third_party/zlib-1.2.3.win32/lib/zlibwapi.lib

    4)编译  切换到gdal主目录

    nmake /f makefile.vc (DEBUG=1如果debug模式的话)

    nmake /f makefile.vc devinstall

    最终完成了gdal编译  并且加入geos,proj(必备项),libkml这些可选项。

    5) 关于调试

    编译完的gdal代码一直无法进行调试,需要增加编译设置才能调试源代码

    nmake /f makefile.vc  DEBUG=1  ANALYZE=1  WITH_PDB=1

  • 相关阅读:
    Python程序编译成二进制的方法及比较:nuitka与pyinstaller
    Cython的使用
    Go高性能之方法接收器 指针vs值
    Trzsz 文件传输利器
    让你的Mac iTerm优雅的上传下载文件
    彻底搞懂之C++智能指针
    万能Debug神器之GDB的使用手册
    一种快速判断点在多边形内的算法
    理解点线拓扑关系的计算原理
    bootstrap 不常用的属性
  • 原文地址:https://www.cnblogs.com/m-zhang-yang/p/13300163.html
Copyright © 2020-2023  润新知