GDAL庫在Visual Studio C++環境中的配置

??本文介紹在Visual Studio軟件中配置、編譯C++ 環境下GDAL庫、SQLite環境與PROJ庫的詳細方法。

??GDAL庫是一個非常方便的地理數據處理庫,但其在C++ 環境下的配置與編譯流程較為復雜;尤其是最新的GDAL 3及以上版本,其在C++ 環境中的配置更是首先需要滿足許多其他的環境配置條件(包括SQLite環境、CMake軟件與PROJ庫),使得其配置變得更復雜一些。本文就詳細介紹在Visual Studio軟件中,配置GDAL庫所需的環境,并最終配置、編譯GDAL庫的方法。

1 寫在前面

??首先,本文是基于Visual Studio 2022軟件進行的配置;其中,GDAL庫版本為3.5.2SQLite環境版本為3.39.4PROJ庫版本為9.1.0。此外,在配置過程中還需要用到跨平臺編譯工具CMake軟件,其版本為3.24.2。如果大家安裝的是以上庫、環境或軟件的其他版本,也可以參考本文,因為整體流程都是近似的;但可能部分操作的細節會稍微有一些差異。

??其次,在編譯PROJ庫時發現,可能是由于PROJ庫最新的9.1.0版本的自身要求,只能編譯Release版本的PROJ庫;若編譯Debug版本則會報錯;而同時,SQLite環境、PROJ庫與最終的GDAL庫需要保持一致(即三者要么都是Release版本,要么都是Debug版本)。因此,本文最終選擇了配置Release版本的GDAL庫;但最終測試代碼時發現,在Visual Studio軟件中無論是Release模式還是Debug模式,都可以成功調用配置好的Release版本的GDAL庫。所以,本文就主要介紹Release版本的GDAL庫的配置方法,但也會在對應流程處注明如果想配置Debug版本的GDAL庫,該如何設置。

2 具體配置

??配置GDAL庫首先需要準備好PROJ庫,而PROJ庫的配置則需要準備好SQLite環境與CMake軟件(這些似乎是GDAL 3及以上版本才需要的,網上很多GDAL 2版本的配置教程都沒有這么麻煩的準備工作);因此我們首先逐一配置好上述這些額外需要的環境或軟件。

2.1 SQLite配置

??首先,我們進行SQLite環境的配置。SQLite是一個由C語言撰寫的數據庫引擎,其為后續需要配置的PROJ庫提供了數據支持,同時配置GDAL庫也會用到這一環境。

??首先,我們進入SQLite官方下載網站https://www.sqlite.org/download.html),并下載“Source Code”中的第一項sqlite-amalgamation-3390400,以及“Precompiled Binaries for Windows”中的第二項sqlite-dll-win64-x64-3390400與第三項sqlite-tools-win32-x86-3390400,一共是三個文件,如下圖所示。這里需要注意,隨著SQLite版本的更新,上述三個文件名稱最后面的一長串數字會隨著改變,大家只需要對照好文件名稱前面的字樣即可。

??隨后,將上述下載好的三個壓縮包文件解壓到同一個文件夾下(下圖是我在配置完SQLite環境之后截的圖,因此文件夾的個數與名稱和大家的會有一些差異)。

??隨后,打開Visual Studio軟件,新建一個項目。我這里因為Visual Studio軟件原本就是開著的,所以就可以選擇“文件”→“新建”→“項目...”。

??隨后,選擇“空項目”,并選擇“下一步”。

??配置好“項目名稱”與“位置”。其中,“項目名稱”我在這里配置為MySQLite,“位置”就選擇剛剛我們解壓縮三個文件的文件夾即可。

??隨后,分別在“頭文件”與“源文件”處右鍵,通過“添加”→“現有項...”的方法,將剛剛解壓縮得到文件中的sqlite3.hsqlite3ext.h文件放入“頭文件”,并將sqlite3.csqlite3.def文件放入“源文件”。

??完成后如下圖所示。

??接下來,選中項目名稱MySQLite,并選擇“屬性”→“配置屬性”→“常規”,選擇“配置類型”,將其選擇為靜態庫(.lib),并在上方的“配置”與“平臺”中將二者選擇為“所有配置”與“所有平臺”。

??接下來,在“C/C++”→“預處理器”中,設置“預處理器定義”。

??在其中復制如下代碼即可。

_USRDLL
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_UNLOCK_NOTIFY

??復制后如下圖所示。

??接下來,在“鏈接器”→“輸入”中配置“模塊定義文件”。

??找到剛剛解壓縮得到的sqlite3.def文件,按下Shift按鈕并右鍵,選擇“復制文件地址”。

??并將其粘貼至“模塊定義文件”中。

??接下來,在Visual Studio軟件中,打開sqlite3.def文件,在其最后一行添加如下的代碼。

sqlite3_unlock_notify

??如下圖所示。

??接下來,在上圖最上方的紅色方框處,將原來的Debug修改為Release,如下圖所示;表示我們接下來將配置Release版本的SQLite環境。如果大家需要Debug版本,那么這里就還是保持選中Debug即可。

??接下來,選中項目名稱,并右鍵選擇“生成”。

??接下來,Visual Studio軟件將生成項目。

??此時,在前面提到的SQLite環境所下載的三個壓縮包文件解壓后所存放的文件夾中,我們新建三個文件夾,分別命名為includelibbin

??隨后,首先在剛剛生成的項目的x64\Release文件夾中,找到MySQLite.lib文件。這里如果大家剛剛生成的是Debug版本的項目,那么就是在Debug文件夾中。

??隨后,將其復制到剛剛新建的lib文件夾中。

??接下來,將sqlite-amalgamation-3390400文件夾中的sqlite3.hsqlite3ext.h文件復制。

??將其粘貼至剛剛新建立的include文件夾中。

??隨后,將sqlite-tools-win32-x86-3390400文件夾中的sqlite.exe文件復制。

??粘貼至剛剛新建立的bin文件夾中。

??以上,即完成了SQLite環境的配置。

2.2 CMake配置

??接下來,我們開始對CMake軟件進行配置。CMake軟件是一個跨平臺的編譯軟件,在后期進行PROJ庫配置時需要用到。

??首先,我們還是在其官方下載網站https://cmake.org/download/)進行軟件的下載。這里我們下載其“Binary distributions”中的第一項即可。

??下載完畢后,可以看到其安裝包。

??雙擊安裝包,進行軟件的安裝即可。這里需要注意,安裝過程中,在以下窗口中我們需要選擇第三項,并勾選中最下方的勾選項,如下圖所示。

??以上,即完成了CMake軟件的配置。

2.3 PROJ配置

??接下來,我們開始PROJ庫的配置。PROJ庫是一個地理坐標轉換庫,用以處理不同的地理坐標數據;因為我們要安裝的GDAL庫是一個地理數據處理庫,因此其固然需要PROJ這一地理坐標轉換庫來完成各項地理數據操作。

??PROJ庫的配置有兩種方法——第一種是傳統方法,即用庫的源代碼來進行編譯;第二種是PROJ庫官網比較推薦的新方法,即用OSGeo4W軟件來進行PROJ庫的下載與編譯。盡管PROJ庫官網目前推薦用第二種方法來配置,但是我一直沒有找到第二種方法配置PROJ庫完畢后其所生成的數據文件,導致沒有辦法進行后續GDAL庫的配置;另一方面,若采用第二種方法,OSGeo4W軟件在下載PROJ庫時經常會出現網絡問題導致的下載終止,且想要再下載還只能重新開始,非常耽誤時間。因此,我個人還是建議大家用第一種方法(也就是下文中的方法一)來實現;雖然這種方法操作起來比較麻煩,但至少比較穩定,而且可以保證后續GDAL庫的配置是可以實現的。同時,本文也將并不推薦的第二種方法的操作流程介紹一下,如果大家感興趣可以研究一下第二種方法。

2.3.1 方法一

??首先,我們在PROJ庫的官方下載網站https://proj.org/download.html)中下載其源代碼。

??在官網,我們還可以看到官方將這種從源代碼編譯的方法稱作“傳統方法”。

??隨后,將下載后的壓縮包解壓,并在解壓后得到的文件夾中新建立一個build文件夾。

??接下來,打開我們剛剛下載、安裝好的CMake軟件,并在下圖所示的兩個編輯欄中,分別選定解壓后的PROJ庫文件夾與我們剛剛在其中新建的build文件夾;隨后,點擊“Configue”。

??隨后,在彈出的窗口中配置我們的Visual Studio軟件版本,并在第二個選項中選擇處理器的架構,一般選擇x64即可。

??隨即,CMake軟件開始運行第一次配置。稍等片刻,一般會出現滿屏幕的紅色,如下圖所示。

??其中,我們需要修改一下上圖中藍色方框內的五條數據。首先,我們在解壓后的PROJ庫文件夾中,新建GTest文件夾。

??并將其作為GTest_DIR后所對應的數據。

??接下來,在CMAKE_INSTALL_PREFIX中,配置一個我們后期將要存放PROJ庫的路徑;接下來的三個數據,我們分別選擇前面配置SQLite環境時,所得到的bin文件夾中的sqlite3.exe文件、include文件夾與MySQLite.lib文件的路徑。具體配置如下圖所示。

??隨后,再點擊一次“Configue”。

??稍等片刻,待其配置完成后,再點擊“Generate”;如上圖所示。

??待其生成完畢后,我們可以在剛剛解壓后的PROJ庫文件夾中新建的build文件夾中,看到如下所示的.sln文件。

??隨后,在開始菜單中找到位于Visual Studio 2022軟件下的“x64 Native Tools Command Prompt for VS 2022”軟件。

??首先,cd進入PROJ庫文件夾中剛剛新建的build文件夾。這里大家依據剛剛自己設定的文件夾路徑來cd進入即可。

cd C:\proj-9.1.0\build

??接下來,輸入如下的代碼,并回車運行。

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

??其中,上述代碼中="Release"表示我們將編譯Release版本的PROJ庫;如果大家需要編譯Debug版本的庫,則將其修改為="Debug"即可。

??這里我們提一句,本文開頭之所以說最終只能編譯Release版本的PROJ庫,是因為一旦前面的代碼我們選擇編譯Debug版本,則其運行后會報錯,出現如下所示的情況。

??其中,這里不同的錯誤,都表明我們目前只能配置Release版本的PROJ庫。

??因此,我在這里最終選擇編譯Release版本的PROJ庫。雖然選擇編譯Release版本的PROJ庫在這里也會有警告出現,但這并不影響最后的結果。

??接下來,我們繼續輸入如下所示的代碼。

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

??其中,如果我們需要編譯Debug版本的庫,則將其修改為="Debug"即可。

??運行代碼,得到結果如下。

??此時,前面提到我們在CMake軟件中設置了CMAKE_INSTALL_PREFIX所對應的文件夾路徑。

??在這個路徑中,此時我們可以看到其已經自動生成了binincludelibshare等四個文件夾。

??以上,即完成了PROJ庫的配置。

2.3.2 方法二

??這里我們介紹一下PROJ庫的第二種配置方法。但前面我們也提到,并不推薦這種方法,大家如果有需要參考一下即可。如果前面已經通過方法一實現了PROJ庫的配置,那么直接跳過這里,繼續閱讀本文2.4部分即可。

??首先,我們按照官方所給出的OSGeo4W軟件下載路徑,進行OSGeo4W軟件的下載。

??或者也可以直接從這里進行下載:https://download.osgeo.org/osgeo4w/osgeo4w-setup.exe

??接下來,進行軟件安裝的過程中,在下圖所示的界面中選擇第二個選項。

??在下圖所示的界面中,選擇第一個選項。

??在下圖所示的界面中,進行如下的配置。

??在下圖所示的界面中,進行如下的配置。

??在下圖所示的界面中,進行如下的配置。

??在下圖所示的界面中,進行如下的配置。

??隨后,在下圖所示的界面中,首先找到第一個選項。

??將其展開后,找到帶有proj字樣的那一行。

??這里要注意,只要確保帶有proj字樣的那一行的New列中,出現庫的版本號即可,其他行的這一列都是顯示為Skip即可。

??隨后,如果出現下圖所示的提示,按照其推薦設置進行配置即可。當然,如果我們前面選擇了只下載PROJ庫的話一般并不會出現這個提示;如果下載時選中的庫比較多,則可能會出現這個。

??隨后,即可開始下載。

??稍等片刻,將下載完畢。

??到這里,PROJ庫的官網就說完成了這一庫的配置。但是通過這樣的方法,我一直沒有辦法找到庫對應的數據文件或其路徑(比如前述libbininclude文件夾等的路徑)。所以最終還是選擇用方法一來實現PROJ庫的配置了。

2.4 GDAL配置

??完成了以上所有的操作,終于可以開始GDAL庫的配置了。

??首先,依然是在其官方下載網站https://gdal.org/download.html)中進行源代碼的下載。

??隨后,將下載得到的壓縮包文件解壓。

??隨后,找到其中的nmake.opt文件,并用Visual Studio軟件打開。

??隨后,在其42行左右(具體行數可能會隨著GDAL庫版本的不同而不同)的位置,將等號后的數字修改為自己Visual Studio軟件的_MSC_VER值。如果大家不知道自己Visual Studio軟件的這一個值是多少,可以參考文章Visual Studio軟件_MSC_VER數值(MSVC編譯器版本)的獲取http://www.lxweimin.com/p/d9c7130e574b)。

??接下來,在66行左右的位置,將這一路徑設置為自己希望編譯后GDAL庫存放的路徑。

??隨后,在130行左右的位置,如果大家需要編譯的是Debug版本的GDAL庫,則將等號后的數字修改為1即可;我們這里需要編譯的是Release版本的GDAL庫,就不用修改。

??隨后,在213行左右的位置,如果我們的電腦是64位的Windows系統,就將這一行的注釋取消掉即可。

??接下來,在245行左右的位置,如果需要動態編譯就不用修改,如果需要靜態編譯就將等號后的數字修改為0。一般我們選擇靜態編譯即可,因此將其修改為0

??接下來,在265行左右,需要我們配置PROJ庫的一些路徑。

??其中,第一個路徑是前面我們在CMake軟件中設置了CMAKE_INSTALL_PREFIX所對應的文件夾路徑下,include文件夾的路徑;第二個路徑是這一文件夾中,lib文件夾中proj.lib文件的路徑。如下圖所示。

??這兩行配置完畢,如下圖所示。

??最后,在638行左右,需要我們配置SQLite環境的一些路徑。

??其中,這里所涉及的文件夾,是前面提到的SQLite環境所下載的三個壓縮包文件解壓后所存放的文件夾中,我們新建的、分別命名為includelibbin的那三個文件夾。其中,將include文件夾的路徑放在第一個位置,將lib文件夾中的MySQLite.lib文件的路徑放在第二個位置。

??配置完畢后,如下圖所示。

??隨后,保存當前nmake.opt文件,并再一次打開“x64 Native Tools Command Prompt for VS 2022”軟件,cd進入剛剛解壓得到的GDAL庫文件夾(也就是nmake.opt文件所在的那個文件夾,這一文件夾下還有一個名為makefile.vc的文件,如下圖所示)。

??隨后,對于我們需要的Release版本,輸入如下代碼并運行。

nmake /f makefile.vc

??運行后得到如下圖所示的結果。

??隨后,輸入如下所示的代碼并運行。

nmake /f makefile.vc devinstall

??運行后得到如下圖所示的結果。

??如果需要的是Debug版本的GDAL庫,那么不用輸入以上兩句代碼,直接分別輸入并運行以下三句代碼即可。

nmake /f makefile.vc WIN64=YES DEBUG=1
nmake /f makefile.vc install
nmake /f makefile.vc devinstall

??此時,在我們剛剛于nmake.opt文件66行左右處所設定的GDAL庫存放路徑(如下圖所示)中,可以看到已經自動生成了相關的文件夾,如下下圖所示。

??以上,即完成了GDAL庫的配置。

3 配置測試

??接下來,我們需要檢查一下GDAL庫是否可以使用。

??我們在Visual Studio軟件中新建一個項目,并寫一段需要調用GDAL庫的代碼;本文就用下面這個很簡單的一段代碼來驗證GDAL庫是否可用。

#include <iostream>
#include <gdal.h>
#include <gdal_priv.h>
using namespace std;

int main() {
    GDALDataset* poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset*)GDALOpen("pic.tif", GA_ReadOnly);
    if (poDataset == NULL)
    {
        cout << "找不到文件,但說明GDAL可以用了";
    }
    return 0;
}

??其中需要注意,如果我們需要調用GDAL庫,就需要在代碼開頭通過以下代碼引入相關的頭文件。

#include <gdal.h>
#include <gdal_priv.h>

??隨后,首先按照文章Visual Studio調用環境配置完畢的第三方庫的方法http://www.lxweimin.com/p/ec307cf18828)中提到的方法,在Visual Studio軟件中配置好相應的屬性設置。

??接下來,將剛剛于nmake.opt文件66行左右處所設定的GDAL庫存放路徑中的bin文件夾,與PROJ庫配置好后在其指定文件夾(即CMake軟件中設置了CMAKE_INSTALL_PREFIX所對應的文件夾)中生成的share文件夾,分別放于系統變量的PATH中;具體方法可以參考文章Windows 10用戶變量、系統變量等環境變量新建、編輯修改與刪除的方法http://www.lxweimin.com/p/1810d3dea4d3)。

??配置好后如下圖最后兩行所示。

??這里如果不配置環境變量的話,在運行調用GDAL庫的代碼時,會出現如下圖所示的錯誤或類似錯誤。

??完成以上操作后,運行代碼。此時,有可能出現找不到proj_9_1.dll文件的錯誤;如下圖所示。

??針對這一情況,我們只需要將編譯好后的PROJ庫中的這一文件復制。

??并粘貼至當前調用GDAL庫的項目的文件夾中即可。

??隨后,運行程序,即可成功調用GDAL庫。

??至此,大功告成~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容