天天看點

GDAL源碼剖析(二)之編譯說明

一、簡單的編譯

1、使用VisualStudio IDE編譯

首先進入GDAL的源代碼目錄,可以看到有幾個sln為字尾的檔案名,比如makegdal10.sln,makegdal80.sln,makegdal71.sln,makegdal90.sln 。這些檔案是VisualStudio的工程檔案,後面的數字對應的VS的版本号,71表示的VS2003,80表示VS2005,90表示VS2008,還有10表示VS2010等。根據自己電腦安裝的VS版本,打開對應的檔案,如下圖所示(使用VS2008SP1版本,打開makegdal90.sln檔案):

圖3 VS2008打開編譯GDAL1.8.1

然後在左側解決方案右鍵,彈出菜單中選擇“生成”或者“重新生成”指令,然後GDAL就會開始編譯,等待輸出視窗中提示,執行完成,生成成功等資訊後,就表示GDAL已經完成編譯。同時會在GDAL的源代碼目錄中會出現gdal.lib,gdal_i.lib,gdal18.dll等檔案,如果你沒有修改GDAL中的nmake.opt檔案的話,那麼同時會在你的C槽中會出現一個叫“C:\warmerda\bld”的檔案夾,裡面會包含三個檔案夾,分别是bin,data和html。其中bin檔案夾中存放的是編譯出來的GDAL的可執行程式,包括GDAL提供的十幾個工具集;data檔案夾就是在第一節中的介紹的data檔案夾;html檔案夾中存放的是各種資料格式的說明文檔。

2、使用cmd指令行編譯

使用cmd指令行編譯,首先在“開始菜單\所有程式\Microsoft Visual Studio 2008\Visual Studio Tools\ Visual Studio 2008指令提示”,點選“Visual Studio 2008 指令提示”會彈出下面的界面:

然後使用cd指令,切換到GDAL的源代碼目錄,如下圖所示:

切換到GDAL的源代碼目錄後,依次敲入下面的指令行後回車,等待編譯結束即可。

nmake -f makefile.vc

nmake -f makefile.vc install

nmake -f makefile.vc devinstall

同時還有其他的指令,如:

nmake -f makefile.vc clean

nmake -f makefile.vc MSVC_VER=1400clean

nmake -f makefile.vc MSVC_VER=1400DEBUG=1

       上面六行的指令含義依次是:

編譯GDAL庫

編譯GDAL庫,并安裝(這裡安裝的意思就是将生成的dll,exe等檔案拷貝到C:\warmerda\bld目錄),

編譯GDAL庫,并安裝開發者模式(安裝的意思同上,開發者模式意思是将開發用的include檔案夾中的頭檔案和lib檔案一同拷貝到C:\warmerda\bld目錄,此時會在C:\warmerda\bld目錄中多出來兩個檔案夾,分别是include和lib,分别存放的是GDAL的頭檔案和lib檔案,用于調用GDAL庫使用)。

清理GDAL庫,同時會删除編譯GDAL庫所生成的臨時檔案,作用相當于在VS環境中的清理指令。

作用同上,但是添加了一個MSVC_VER=1400,表示使用VS2005編譯。

編譯GDAL庫的debug模式,可以用來調試GDAL源碼。

二、自定義編譯

GDAL的強大之處不單單在于可以讀取栅格和矢量資料,同時它的強大之處還在于下面幾個方面,第一可以進行矢量圖形之間的一些常用操作,比如:求交,求并,緩沖區等等。第二可以進行投影和坐标轉換。如果使用GDAL預設的編譯方式,那麼上述的兩個非常強大的功能您将不能使用,因為GDAL這兩大功能是基于另外的兩個開源庫GEOS(Geometry Engine, Open Source)庫和PROJ4庫來實作的。下面對這兩大庫分别做一個簡單的說明,以及如何修改編譯檔案,讓GDAL能夠擁有這兩大功能。

1、內建GEOS

關于GEOS庫的說明,網上有很多,同時在GEOS的官網http://geos.osgeo.org有詳細的說明,簡單的來說,GEOS提供了OGC規範中簡單幾何要素對象操作的C++語言的實作。在地理資訊系統領域,拓撲模型是重要的,其計算方法簡單但是很難得以實作。使得GEOS不同于其他項目的也正是“空間謂詞”與“空間操作”。空間謂詞是比較兩個空間對象并傳回一個布爾變量值作為結果,它表明了存在于兩個空間對象之間特殊的關系。比如典型的空間謂詞有Contains(), Intersects(), Touches(), andCrosses()函數等。GEOS項目中對該些函數的實作是異常強壯的,即使是奇異幾何對象或是臨時的坐标系統運算也不能使其運算不正常或計算錯誤。目前絕大多數的商業軟體仍然在最基礎的空間謂詞處理上相對成熟,這正是GEOS項目的重要意義。“空間操作”則主要是對兩個幾何對象進行計算并且傳回一個新的幾何實體。比較典型的操作函數如Difference(), Union()以及Buffer()等。GEOS中的操作算法已經被廣泛的經過了測試。GEOS類庫被各類開源空間資訊軟體項目廣泛應用,使用GEOS,它們可以基于最新的規範的幾何實體來完成,同時也擁有了複雜空間方法的實作。

關于GEOS的說明和編譯,後面會單獨寫一篇檔案進行介紹,這裡假設已經下載下傳的是編譯好的GEOS庫。

首先使用記事本或者其他的文本編輯器打開GDAL源代碼目錄下的nmake.opt檔案,找到“# Uncomment for GEOS support”這句,大概在405行左右,将下面三行代碼:

#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=F:\Work\3rdPart\geos-3.2.2

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

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

其中F:\Work\3rdPart\geos-3.2.2是我本機的GEOS存放的主目錄,後面兩行設定的是GEOS的頭檔案目錄和lib檔案路徑。設定好後儲存即可。對比結果如下圖如下:

儲存完nmake.opt之後按照第一步中的編譯方式進行編譯即可。編譯後的GDAL就将會支援圖形之間的操作等處理。函數主要是在OGR庫中,後面會在OGR庫中進行詳細的介紹說明。編譯後,千萬别忘記将geos_c.dll檔案拷貝到gdal18.dll的同級目錄下,否則會提示你找不到geos_c.dll檔案。

2、內建Proj4

Proj4是一套開源的坐标投影轉換類庫,它可以完成在兩套不同制圖投影系統之間的轉換,同樣不同的橢球體或大地基準面之間也可以成功的完成轉換。GDAL中用到的坐标轉換,投影轉換,幾何糾正,正射糾正等算法,都離不開坐标轉換,也就是說要使用這些算法,必須有proj4庫的支援才行。同GEOS庫的配置方法,在nmake.opt檔案中,找到proj4庫的位置,大概在352行左右。将下面的三行代碼:

#PROJ_FLAGS =-DPROJ_STATIC

#PROJ_INCLUDE =-Id:\projects\proj.4\src

#PROJ_LIBRARY =d:\projects\proj.4\src\proj_i.lib

修改為:

#PROJ_FLAGS =-DPROJ_STATIC

PROJ_INCLUDE =-IF:\Work\3rdPart\proj-4.7.0\src

PROJ_LIBRARY =F:\Work\3rdPart\proj-4.7.0\src\proj_i.lib

其中第一行表示是否使用靜态連結的方式,第二行的路徑表示,proj庫存放的位置,第三行為proj庫的lib檔案所在路徑。修改後儲存即可,對比結果如下圖如下:

同GEOS庫一樣,儲存完nmake.opt之後,按照第一步中的編譯方式進行編譯即可。對于Proj庫的使用後面會在有一篇文章對其做一個簡單的介紹說明。編譯後,同樣千萬别忘記将proj.dll檔案拷貝到gdal18.dll的同級目錄下,否則會提示你找不到proj.dll檔案。

3、內建HDF資料讀取

通過上面GEOS和PROJ庫的介紹,相信對gdal的配置檔案,nmake.opt有一個比較初步的了解了吧,那麼下面對于使用GDAL支援hdf資料的讀取也是同樣,先下載下傳好hdf4和hdf5的庫,我用的是HDF4.2.6和HDF5-1.8.7兩個庫,在hdf的官方網上有編譯好的庫,直接下載下傳編譯好的庫即可,對于hdf庫的編譯,我沒有進行編譯過,應該和其他的開源庫都是差不多吧。同時官網提供了32位的庫和64位的庫,這裡都是按照32位的庫進行介紹,後面會有一個gdal的64位庫的編譯介紹。

将下載下傳好的HDF4.2.6和HDF5-1.8.7兩個庫解壓,然後修改nmake.opt檔案中的278行左右,代碼如下:

# Uncomment thefollowing and update to enable NCSA HDF Release 4 support.

#HDF4_PLUGIN = NO

#HDF4_DIR =       D:\warmerda\HDF41r5

#HDF4_LIB =        /LIBPATH:$(HDF4_DIR)\lib Ws2_32.lib

# Uncomment thefollowing and update to enable NCSA HDF Release 5 support.

#HDF5_PLUGIN = NO

#HDF5_DIR =       c:\warmerda\supportlibs\hdf5\5-164-win

#HDF5_LIB =        $(HDF5_DIR)\dll\hdf5dll.lib

修改為下面的代碼:

# Uncomment thefollowing and update to enable NCSA HDF Release 4 support.

HDF4_PLUGIN = NO

HDF4_DIR =          F:\Work\3rdPart\HDF4.2.6_win_x86

HDF4_LIB =  $(HDF4_DIR)\dll\hd426m.lib$(HDF4_DIR)\dll\hm426m.lib \

$(HDF4_DIR)\lib\hd426.lib$(HDF4_DIR)\lib\hm426.lib Ws2_32.lib

# Uncomment thefollowing and update to enable NCSA HDF Release 5 support.

HDF5_PLUGIN = NO

HDF5_DIR =          F:\Work\3rdPart\HDF5-1.8.7_win_x86

HDF5_LIB = $(HDF5_DIR)\dll\hdf5dll.lib

對比代碼如下圖:

儲存,然後編譯gdal即可,同時将hdf庫中的dll檔案夾下的dll檔案拷貝到gdal18.dll的同級目錄下。

三、其他方面

1、makegdal_gen.bat使用

對于makegdal_gen.bat的作用,在上一篇文章中已經進行了介紹,下面對怎麼使用該檔案生成VS的工程檔案做一個說明。

首先打開cmd指令行視窗,使用cd指令切換到GDAL源代碼目錄,然後輸入makegdal_gen.bat回車,會得到該工具的一個簡單實用幫助,如下圖所示:

該工具的使用方法是帶有指令行參數的一個批處理工具,(在後面對GDAL工具集的介紹中會對帶有參數的指令行程式,以及編寫帶有指令行的程式有一個比較詳細的說明)。通過上圖可以看出該工具的基本文法是:

makegdal_gen 7.10 >makegdal71.vcproj

makegdal_gen 8.00 >makegdal80.vcproj

通過上面的示例可以看出,該工具的指令行參數分别是,首先是VS的版本号,具體版本号參考本文第一小節,然後跟一個大于号“>”,最後是輸出的VS的工程的名字。那麼現在我要使用該指令行生成一個VS2008版本的工程檔案,我可以輸入下面的指令,然後回車即可:

makegdal_gen 9.00 >makegdal90.vcproj

2、編譯64位系統下的GDAL

對于GDAL的64位系統的編譯,基本和32位系統的編譯一樣,首先在VS的工程中,打開配置管理器,然後再活動解決方案平台的下拉清單中選擇建立,然後彈出,建立解決方案平台對話框,選擇新平台為x64(需要在安裝VS的時候安裝64位的編譯環境),然後點選确定即可。最後在VS中選擇X64進行編譯即可。如下圖所示:

對于使用cmd指令行編譯,基本同本文開始,不一樣的隻有,在開始菜單選擇的不是“Visual Studio 2008 指令提示”而是“Visual Studio 2008 x64 相容工具指令提示”,剩下的編譯步驟跟前面的一樣。

在編譯開始之前,還需要打開nmake.opt檔案,找到131行處的“#WIN64=YES”,将前面的“#”去掉,儲存,然後開始編譯。如果就這樣編譯過去的話,那麼恭喜你,如果不能順利編譯過去的,那麼需要按照下面的步驟進行一點點設定。

1:在GDAL目錄下的nmake.opt檔案中,找到SYM_PREFIX的定義,應該在438行左右

将SYM_PREFIX=_ 改為SYM_PREFIX= 就是将最後的下劃線去掉

2:在GDAL目錄下的makefile.vc檔案中,找到46行左右的代碼,如下:

BASE_INCLUDE =/INCLUDE:_GDALSimpleImageWarp@36 \

  /INCLUDE:_GDALReprojectImage@48 \

  /INCLUDE:_GDALComputeMedianCutPCT@32 \

  /INCLUDE:_GDALDitherRGB2PCT@28 \

  /INCLUDE:_OCTNewCoordinateTransformation@8$(VB6_SAFEARRAYSYM)

修改為:

BASE_INCLUDE =/INCLUDE:$(SYM_PREFIX)GDALSimpleImageWarp \

  /INCLUDE:$(SYM_PREFIX)GDALReprojectImage \

  /INCLUDE:$(SYM_PREFIX)GDALComputeMedianCutPCT\