VS2010编译32/64位GDAL 2.1.3

来源:互联网 发布:mac触摸板按键声音大 编辑:程序博客网 时间:2024/04/30 01:01

1、 下载源码

下载GDAL源码gdal213.zip,解压。建议解压两次,分别重命名文件夹为gdal-2.1.3-32和gdal-2.1.3-64,以便不同的文件夹编译不同的版本,防止混乱。

 

2、 编译xerces

Ø  下载xerces-c-3.1.4源码,解压c盘根目录。

Ø  打开C:\xerces-c-3.1.4\projects\Win32\VC10\xerces-all\xerces-all.sln编译生成32位和64位release版的lib与dll,分别在C:\xerces-c-3.1.4\Build\Win32\VC10\Release与C:\xerces-c-3.1.4\Build\Win64\VC10\Release路径下。

 

3、 安装ArcSDE的SDK

解压ArcSDE10SDK.iso,安装ArcSDE10SDK的32位版本和64位版本,本例分别对应安装在C:\ArcGIS\arcsde32与C:\ArcGIS\arcsde64路径。

 

4、 nmake.opt修改

Ø  32位执行执行如下步骤

1)  搜索定位“MSVC_VER=1500”,改为“MSVC_VER=1600”

2)  搜索定位“GDAL_HOME”,建议改为“GDAL_HOME = "C:\warmerda\bld32"”以示区分。

3)  搜索定位“XERCES_DIR”,删除“#”符号反注释,设置相关路径,与步骤2对应:

XERCES_DIR=        C:\xerces-c-3.1.4

XERCES_INCLUDE= -I$(XERCES_DIR)/src -I$(XERCES_DIR)/src/xercesc

XERCES_LIB = $(XERCES_DIR)/Build/Win32/VC10/Release/xerces-c_3.lib

4)  搜索定位“SDE_ENABLED”,删除“#”符号反注释,设置路径和文件名,与步骤3对应:

SDE_ENABLED= YES

SDE_VERSION=100

SDE_PLUGIN= YES

SDE_SDK= C:\ArcGIS\arcsde32

SDE_INC= $(SDE_SDK)\include

SDE_LIB= $(SDE_SDK)\lib\pe.lib \

          $(SDE_SDK)\lib\sde.lib $(SDE_SDK)\lib\sg.lib

 

Ø  对于64位执行如下步骤

1)  搜索定位“MSVC_VER=1500”,改为“MSVC_VER=1600”。

2)  搜索定位“GDAL_HOME”,建议改为“GDAL_HOME ="C:\warmerda\bld64"”以示区分。

3)  搜索定位“SYM_PREFIX=_”,将其改为“SYM_PREFIX=”。

4)  搜索定位“#WIN64=YES”,改为“WIN64=YES”。

5)  搜索定位“XERCES_DIR”,删除“#”符号反注释,设置相关路径,与步骤2对应,如下:

XERCES_DIR=        C:\xerces-c-3.1.4

XERCES_INCLUDE= -I$(XERCES_DIR)/src -I$(XERCES_DIR)/src/xercesc

XERCES_LIB= $(XERCES_DIR)/Build/Win64/VC10/Release/xerces-c_3.lib

5)  搜索定位“SDE_ENABLED”,删除“#”符号反注释,设置路径和文件名,与步骤3对应:

SDE_ENABLED= YES

SDE_VERSION=100

SDE_PLUGIN= YES

SDE_SDK= C:\ArcGIS\arcsde64

SDE_INC= $(SDE_SDK)\include

SDE_LIB= $(SDE_SDK)\lib\pe.lib \

          $(SDE_SDK)\lib\sde.lib$(SDE_SDK)\lib\sg.lib

 

5、 makefile.vc修改(只针对64位)

找到如下语句:

!IF$(MSVC_VER) < 1500

VB6_SAFEARRAYSYM=        /INCLUDE:_vbSafeArrayToPtr@16

!ENDIF

 

BASE_INCLUDE=  /INCLUDE:_GDALSimpleImageWarp@36 \

           /INCLUDE:_GDALReprojectImage@48 \

           /INCLUDE:_GDALComputeMedianCutPCT@32\

           /INCLUDE:_GDALDitherRGB2PCT@28 \

           /INCLUDE:_OCTNewCoordinateTransformation@8$(VB6_SAFEARRAYSYM)

 

修改为:

!IF$(MSVC_VER) < 1500

VB6_SAFEARRAYSYM=        /INCLUDE:_vbSafeArrayToPtr

!ENDIF

 

BASE_INCLUDE=  /INCLUDE:_GDALSimpleImageWarp \

           /INCLUDE:_GDALReprojectImage \

           /INCLUDE:_GDALComputeMedianCutPCT \

           /INCLUDE:_GDALDitherRGB2PCT \

           /INCLUDE:_OCTNewCoordinateTransformation$(VB6_SAFEARRAYSYM)

即删除@和后面的数字,有相关Link错误的,都需要删除。

 

6、 源码修改

1)  GDAL_HOME\frmts\gdalallregister.cpp中,GDALAllRegister()函数的第一行添加以下语句,解决中文路径问题:

CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");

2)  GDAL_HOME\ogr\ogrsf_frmts\generic\ogrregisterall.cpp中,OGRRegisterAll()函数第一行添加以下语句,解决中文路径问题:

CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");

3)  GDAL_HOME\ogr\swq.cpp文件中,swq_identify_field函数中,将以下语句:

constchar* pszDot = strchr(field_token, '.');

if(pszDot && strchr(pszDot+1, '.') == NULL )

改为:

constchar* pszDot = strrchr(field_token, '.');

if(pszDot && strrchr(pszDot+1, '.') == NULL )

4)  GDAL_HOME\ogr\ogrsf_frmts\sde\ogrsdelayer.cpp文件中,将以下语句:

char*pszUTF8 = CPLRecodeFromWChar((const wchar_t*)pszTempStringUTF16, CPL_ENC_UTF16,CPL_ENC_UTF8);

poFeat->SetField(i, pszUTF8 );

CPLFree(pszUTF8 );

修改为:

char*pszText = new char[(poFieldDef->GetWidth()+1) * sizeof(SE_WCHAR )];

memset(pszText,0, (poFieldDef->GetWidth()+1) * sizeof(SE_WCHAR ));

WideCharToMultiByte(CP_ACP,0, (WCHAR*)(pszTempStringUTF16), (poFieldDef->GetWidth()+1) *sizeof(SE_WCHAR ), pszText, (poFieldDef->GetWidth()+1) * sizeof(SE_WCHAR ),0, 0);

poFeat->SetField(i, pszText );

delete[]pszText;

pszText= NULL;

同时在最顶端添加“#include <windows.h>“,一定要放在最上面,否则编译会产生windef.h中的各种类型错误。

5)  GDAL_HOME\ogr\ogrsf_frmts\gml\gmlreader.cpp文件中的SetFeaturePropertyDirectly函数前,添加以下功能函数:

std::stringConvertUtf8ToGBK(const char* strUtf8)

{

         int len = MultiByteToWideChar(CP_UTF8,0, (LPCTSTR)strUtf8, -1, NULL,0);

         wchar_t * wszGBK = new wchar_t[len];

         //ZeroMemory(wszGBK, wcslen(wszGBK));

         memset(wszGBK, 0, len *sizeof(wchar_t));

         MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8,-1, wszGBK, len);

         len = WideCharToMultiByte(CP_ACP, 0,wszGBK, -1, NULL, 0, NULL, NULL);

         char *szGBK=new char[len + 1];

         memset(szGBK, 0, (len + 1) * sizeof(char));

         WideCharToMultiByte (CP_ACP, 0, wszGBK,-1, szGBK, len, NULL,NULL);

         std::string strTemp(szGBK);

         delete []szGBK;                  szGBK = NULL;

         delete        []wszGBK;        wszGBK = NULL;

         return strTemp;

}

在poFeature->SetPropertyDirectly(iProperty, pszValue );前,添加代码:

std::stringstrTemp = ConvertUtf8ToGBK(pszValue);

ZeroMemory(pszValue,strlen(pszValue));

strcpy(pszValue,strTemp.c_str());

在顶端添加头文件“#include<Windows.h>”与“#include <string>“。

 

7、 执行编译

Ø  对于32位,启动“VisualStudio 命令提示(2010)“。

Ø  对于64位,启动“VisualStudio x64 Win64 命令提示(2010)“。

Ø  注意,每次修改nmake.opt重新编译时,务必首先执行nmake /f makefile.vc clean清除,否则会产生链接错误。

以下对32/64位均相同

1)  cd GDAL_HOME 定位到GDAL根路径

2)  nmake /fmakefile.vc 编译

3)  nmake /fmakefile.vc install 安装

4)  nmake /fmakefile.vc devinstall 开发版本安装

 

8、 使用

Ø  对于32位,GDAL安装结果在C:\warmerda\bld32文件夹下。将C:\xerces-c-3.1.4\Build\Win32\VC10\Release路径下的xerces-c_3_1.dll放在C:\warmerda\bld32\bin目录下。

Ø  对于64位,GDAL安装结果在C:\warmerda\bld64文件夹下。将C:\xerces-c-3.1.4\Build\Win64\VC10\Release路径下的xerces-c_3_1.dll放在C:\warmerda\bld32\bin目录下。

0 0