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

原文地址:http://blog.csdn.net/liminlu0314/article/details/6937194


一、簡單的編譯

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=1400 clean

nmake -f makefile.vc MSVC_VER=1400 DEBUG=1(注意:DEBUG前有空格)

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

編譯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編譯。且vs2010MSVC_VER=1600

編譯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\

  /INCLUDE:$(SYM_PREFIX)GDALDitherRGB2PCT \

 /INCLUDE:$(SYM_PREFIX)OCTNewCoordinateTransformation $(VB6_SAFEARRAYSYM)

就是將後面的@開始,後面的數字刪除。現在開始編譯吧,呵呵。祝你成功!此處可以參考我的博文:http://liminlu0314.blog.163.com/blog/static/111800520106223508717/

3、GDAL1.8後打開中文路徑失敗問題

此處可以參考我的博文:http://blog.csdn.net/liminlu0314/article/details/6610069,在此不再贅述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章