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:\gdal\PROJ-6.1\build\googletest-download\googletest-prefix\src

目录下面,完成了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:\gdal\geos-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_party\expat.win32/libexpat.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/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

gdal3.1.0+VS2017+geos+kml编译总结的更多相关文章

  1. win10 x64 VS2017 PJSIP 视频通话编译流程

    win10 x64 VS2017 PJSIP 视频通话编译流程 1. 下载PJSIP源码 PJSIP源码下载地址:https://www.pjsip.org/ 2. 阅读一遍官方的文档 文档地址:ht ...

  2. 在阿里云中编译Linux4.5.0内核 - Ubuntu内核编译教程

    实验环境:Ubnuntu 64位(推荐使用14.04)+Xshell 阿里云现在提供的云服务器很好用的,用来编译内核性能也不错.本文介绍最基本的内核编译方法,为了方便,所有操作均在root用户下进行. ...

  3. 英蓓特Mars board的android4.0.3源码编译过程

    英蓓特Mars board的android4.0.3源码编译过程 作者:StephenZhu(大桥++) 2013年8月22日 若要转载,请注明出处 一.编译环境搭建及要点: 1. 虚拟机软件virt ...

  4. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  5. ACE-6.1.0 linux 下的编译与安装步骤

    ACE-6.1.0 linux 下的编译与安装步骤  引用至http://www.cnblogs.com/liangxiaxu/archive/2013/03/07/2948417.html 1.从  ...

  6. Hadoop-2.3.0的Eclipse插件编译

    Hadoop-2.3.0的Eclipse插件编译 #cd /usr/local/src/hadoop2x-eclipse-plugin-master/src/contrib/eclipse-plugi ...

  7. vs2017+qt5.x编译32位应用<转>

    原文地址:https://www.cnblogs.com/woniu201/p/10862170.html 概述 最近有同学私信我,问如何使用vs2017+qt5.10编译出32位的应用,需要使用ms ...

  8. 【Qt开发】vs2017+qt5.x编译32位应用

    概述 最近有同学私信我,问如何使用vs2017+qt5.10编译出32位的应用,需要使用msvc2017_x86的插件,然而qt官网并没有提供,只能使用源码编译生成msvc2017_x86插件,使用n ...

  9. edgex0.7.1_1.0.1的X86编译和交叉编译

    一. X86编译 1. 安装zeromq库 根据setup script安装: wget https://github.com/zeromq/libzmq/releases/download/v4.2 ...

随机推荐

  1. JS014. toFixed( )调试踩坑 - 浏览器思维 点常量 & 点运算符

    Number.prototype.toFixed( ) 在观察toFixed()丢失精度问题,和对toFixed()方法重写的调试过程时,发现toFixed()对Number的识别有它自己的规则,并找 ...

  2. CSS滤镜让图片模糊(毛玻璃效果)

    CSS代码: .blur { filter: url(blur.svg#blur); /* FireFox, Chrome, Opera */ -webkit-filter: blur(10px); ...

  3. 【曹工杂谈】Maven IOC容器的下半场:Google Guice

    Maven容器的下半场:Guice 前言 在前面的文章里,Maven底层容器Plexus Container的前世今生,一代芳华终落幕,我们提到,在Plexus Container退任后,取而代之的底 ...

  4. 【转】shell脚本中echo显示内容带颜色的实现方法

    shell脚本中echo显示内容带颜色的实现方法 shell脚本里使用echo输出颜色  

  5. 手把手教你 Docker Compose安装DOClever

    一.什么是Docker Compose以及Docker Compose的安装和使用 查看我的另外一篇博客:Docker Compose的安装和使用 二.DOClever是什么 DOClever是一个可 ...

  6. VB自制计算器

    使用visual basic编写. 绘制如下的按钮界面: 然后代码如下: Dim a, temp, ans As Integer Dim op As String Sub showans() Text ...

  7. stderr,stdin,stdout相关

    转载请保留原作者. 目录 一.stdin和stdout 1.意义 2.缓冲 2.1.scanf的缓冲问题 2.2.fflush 3.freopen 二.stderr 1.输出方法 2.默认缓冲 一.s ...

  8. ACID的实现原理

    引言 ACID是事务的特点也是必须的要求,只有保证ACID事务的执行才不会出错,分别是原子性.一致性.隔离性和持久性.我们知道典型的MySQL事务是这样执行的: start transaction 开 ...

  9. vue项目实现文件下载进度条

    平时业务中下载文件方式常见的有俩种: 第一种,直接访问服务器的文件地址,自动下载文件: 第二种 ,服务器返回blob文件流,再对文件流进行处理和下载. 一般小文件适用于第一种下载方案,不占用过多服务器 ...

  10. PHP的加密伪随机数生成器的使用

    今天我们来介绍的是 PHP 中的加密伪随机数生成器(CSPRNG 扩展).随机数的生成其实非常简单,使用 rand() 或者 mt_rand() 函数就可以了,但是我们今天说的这个则是使用了更复杂算法 ...