??本文介紹在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.2
,SQLite
環境版本為3.39.4
,PROJ
庫版本為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.h
與sqlite3ext.h
文件放入“頭文件”,并將sqlite3.c
與sqlite3.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
環境所下載的三個壓縮包文件解壓后所存放的文件夾中,我們新建三個文件夾,分別命名為include
、lib
與bin
。
??隨后,首先在剛剛生成的項目的x64\Release
文件夾中,找到MySQLite.lib
文件。這里如果大家剛剛生成的是Debug
版本的項目,那么就是在Debug
文件夾中。
??隨后,將其復制到剛剛新建的lib
文件夾中。
??接下來,將sqlite-amalgamation-3390400
文件夾中的sqlite3.h
與sqlite3ext.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
所對應的文件夾路徑。
??在這個路徑中,此時我們可以看到其已經自動生成了bin
、include
、lib
與share
等四個文件夾。
??以上,即完成了PROJ
庫的配置。
2.3.2 方法二
??這里我們介紹一下PROJ
庫的第二種配置方法。但前面我們也提到,并不推薦這種方法,大家如果有需要參考一下即可。如果前面已經通過方法一實現了PROJ
庫的配置,那么直接跳過這里,繼續閱讀本文2.4部分即可。
??首先,我們按照官方所給出的OSGeo4W軟件下載路徑,進行OSGeo4W軟件的下載。
??或者也可以直接從這里進行下載:https://download.osgeo.org/osgeo4w/osgeo4w-setup.exe。
??接下來,進行軟件安裝的過程中,在下圖所示的界面中選擇第二個選項。
??在下圖所示的界面中,選擇第一個選項。
??在下圖所示的界面中,進行如下的配置。
??在下圖所示的界面中,進行如下的配置。
??在下圖所示的界面中,進行如下的配置。
??在下圖所示的界面中,進行如下的配置。
??隨后,在下圖所示的界面中,首先找到第一個選項。
??將其展開后,找到帶有proj
字樣的那一行。
??這里要注意,只要確保帶有proj
字樣的那一行的New
列中,出現庫的版本號即可,其他行的這一列都是顯示為Skip
即可。
??隨后,如果出現下圖所示的提示,按照其推薦設置進行配置即可。當然,如果我們前面選擇了只下載PROJ
庫的話一般并不會出現這個提示;如果下載時選中的庫比較多,則可能會出現這個。
??隨后,即可開始下載。
??稍等片刻,將下載完畢。
??到這里,PROJ
庫的官網就說完成了這一庫的配置。但是通過這樣的方法,我一直沒有辦法找到庫對應的數據文件或其路徑(比如前述lib
、bin
與include
文件夾等的路徑)。所以最終還是選擇用方法一來實現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
環境所下載的三個壓縮包文件解壓后所存放的文件夾中,我們新建的、分別命名為include
、lib
與bin
的那三個文件夾。其中,將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
庫。
??至此,大功告成~