[QGIS]VS2017+QT5.12.10+QGIS3.16環境搭建及開發全流程

攻城的炮車發表於2021-10-28

題記:大力發展生產力,助力高效採集。

轉載請註明出處,本文地址:
https://www.cnblogs.com/1024bytes/p/15477374.html

本篇隨筆分為五個部分:

一、獲取QGIS3.16.6原始碼

二、安裝Cygwin、OSGeo4W64並下載QGIS開發所需檔案

三、利用CMake工具和QGIS3.16原始碼生成QGIS工程

四、第三方庫qca、qsci、qtchain、qwt的debug編譯

五、VS2017+QT5.12.10編譯CMake生成的QGIS工程

六、VS、QT、QGIS編譯中遇到的問題及解決方案

七、建立一個基於VS2017+Qt5.12.10+QGIS3.16編譯環境的GIS應用程式


一、獲取QGIS3.16原始碼
https://github.com/qgis/QGIS/releases

二、安裝Cygwin、OSGeo4W64,並下載QGIS開發所需檔案

1、Cygwin
1.1 下載地址:http://www.cygwin.com/
1.2 安裝:如果代理上網選擇Use HTTP/FTP Proxy,填寫正確的代理主機和埠;選擇一個下載站點。
1.3 下載GNU flex, GNU bison:

(1)View選擇Category(若不是,點選View可更改);
(2)Search輸入要下載的內容,本工具只用下載flex和bison;
(3)選中Best,選擇Devel並展開,如果當前未下載則顯示的是"Skip",點選會變成具體的版本,然後點選下一步即可下載(下過的,顯示的是版本號和keep);
(4)Search一個庫之後,點選"Skip"使其出現版本編號後,清除search框的內容,繼續search下一個。全部搜尋點選完成後,再點選下一步,所有搜尋項將會一起下載;
(5)注意上述路徑不要有中文或空格; 下載完成後會顯示keep標識。

2、安裝OSGeo4W64
2.1 OSGeo4W64安裝包下載地址: http://download.osgeo.org/osgeo4w/
2.2 用OSGeo4W64下載QGIS編譯需要的依賴(Proj、GEOS、GDAL、Expat、libspatialindex、SpatiaLite、LibZip、Sqlite3、python3、GSL):
(1) Search選擇安裝qgis-dev-deps(qgis-ltr-deps)可以下全。
(2) 操作同Cygwin的步驟類似

三、第三方庫qca、qsci、qtchain、qwt的debug編譯

第三方庫qca、qsci、qtchain、qwt需要編譯Qt5.12.10的debug版,參見下面的兩篇博文:

https://www.cnblogs.com/superbi/p/11188145.html

https://www.cnblogs.com/m-zhang-yang/p/14694147.html

四、利用CMake工具和QGIS3.16原始碼生成QGIS工程

1、下載CMake工具並安裝,比如安裝在D盤。下載地址:https://cmake.org/download/

2、在OSGeo4W64裡建立一個qgis_setup.bat檔案,輸入以下指令碼:

什麼指令碼?稍後補上。

 

根據實際情況修改指令碼中的引數,儲存。

2、Powershell或命令提示符cmd執行qgis_setup.bat,然後輸入命令cmake-gui開啟Cmake程式

3、配置cmake引數(注意平臺型別及VS版本選項)

3.1、選擇原始碼目錄(Where is the source code):D:/QGIS/qgis-3.16.6

3.2、選擇構建目錄(Where to build the binaries):D:/QGIS/build1020

3.3、勾選Grouped、Advanced選項。

3.4、填寫QCA、QSCINTILLA、QTKEYCHAIN、QWT的引數。我是把Qt5.12.10版本的這4個第三方庫放在D:/QGIS/thirdPartWithinQt5.12.10目錄裡。

QCA QCA_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include/QtCrypto
QCA QCA_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qca-qt5.lib
QSCINTILLA *QSCINTILLA_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include
QSCINTILLA QSCINTILLA_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qscintilla2_qt5.lib
QTKEYCHAIN QTKEYCHAIN_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include/qt5keychain
QTKEYCHAIN QTKEYCHAIN_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qt5keychain.lib
QWT QWT_INCLUDE_DIR D:/QGIS/thirdPartWithinQt5.12.10/include/qwt6
QWT QWT_LIBRARY D:/QGIS/thirdPartWithinQt5.12.10/lib/qwt.lib

*QSCINTILLA_INCLUDE_DIR對應的目錄到include即可,CMake會自動新增Qsci,也許後續CMake版本對路徑的處理會跟其他幾項保持一致。

注意:這裡的lib用的是release版本的(檔名沒有加d),在用VS編譯QGIS解決方案時需要注意修改Linker裡的這幾個lib為debug版(檔名加d);同樣也要檢查所有Qt的lib為debug版。

3.5、填寫其他需要填寫的引數:bision、flex等。

3.6、去除WITH_BINDINGS、WITH_QTWEBKIT、WITH_GRASS7的勾。去除ENABLE下的ENABLE_TESTS,如果需要TESTS工程,可以不去除它。

3.7、Configure卡住的時候,結束程式中的python3.exe程式。

4、點選generate生成qgis工程。

Q&A

Q:Could NOT find PkgConfig (missing PKG_CONFIG_EXECUTABLE)
A:Windows下資訊提示,可以不管,無害。也可以安裝pkg-config(下載地址是https://sourceforge.net/projects/pkgconfiglite/files),填寫pkg-config.exe的路徑。(You are not supposed to use PkgConfig on Windows.The error is not really an error, it's an informative message. It's completely harmless. Please keep in mind that Ogre has many optional dependencies, you don't need to satisfy all of them. See http://www.freedesktop.org/wiki/Software/pkg-config)。

Q:Cmake Error:Cannot open file for write “/cmakeCache.txt.tmpxxxxx”
A:同一DOS視窗多次執行qgis_setup.bat命令或多次點選camke_gui的配置佔用了臨時檔案,關閉重來即可。

Q:MDAL_LIBRARY NOTFOUND
A:MDAL選項一般不會出現,它位於qgis原始碼的src/extern裡。cmake時候出現報錯,關閉重來即可。

Q:WITH選項裡哪些可以不選?
A:WITH_BINDINGS(它用於與Python繫結)、WITH_QTWEBKIT(由於QT5.6起棄用了Qt5Webkit,QGIS3沒有更換庫,如果勾上,嘗試用OSGeo4W64/apps/Qt5裡帶的)、WITH_GRASS7(GRASS_INCLUDE_DIR7可以不填)。另外ENABLE下的ENABLE_TESTS可以不選。

Q:QSCINTILLA_INCLUDE_DIR路徑錯誤
A:這個路徑填寫到include這一級即可,會自動新增Qsci。qwt、qtkeychain、qca要進一級(cmake3.20.1是這樣,也許後續版本會一致)。

Q:編譯qgis_core工程時,依賴工程qgis_core_autogen編譯時報以下錯誤:Fatal Python error : initfsencoding: unable to load the file system codec.ModuleNotFoundError: No module named 'encodings'
A:增加系統變數:PYTHONHOME=D:\OSGeo4W\apps\Python37即可。

 

五、VS2017+QT5.12.10編譯CMake生成的QGIS解決方案

這裡假定VS2017與QT5.12.10IDE環境已配置好。此時可以開啟Cmake生成的build1020裡的qgis.sln解決方案,但是我們不需要全部編譯,因此新建一個解決方案,不妨叫GisTest.sln。從build1020/src裡新增下表中的工程vcxproj(Adding Existing Project):

Existing Project Project Directory ( Default in build1020/src )
libdxfrw app/dwg/libdxfrw
postgresprovider providers/postgres
qgis qgis
qgis_analysis analysis
qgis_analysis_autogen analysis
qgis_app app
qgis_core core
qgis_core_autogen core
qgis_desktop ..
qgis_gui gui
qgis_native native
qgis_process process
ui ui
version ..
ZERO_CHECK ..

將qgis設為啟動項(Set As Setup Project);新增的每一個工程,Linker->Input->Additional Dependencies裡,都要檢查Qt和第三方庫的lib,和編譯的release/debug一致,debug的lib跟release的lib區別是,debug的lib檔名後多了一個d,如:qwtd.lib、Qt5Guid.lib。

Qgis的執行依賴OSGeo4W64/bin裡的動態庫,資料夾先過濾“應用程式擴充套件”,debug版的話再搜尋*d.dll,複製這128個debug版的dll到build1020/output/bin/debug中。同理還依賴QT5.12.10 debug版的動態庫及第三方debug版的庫,一同拷貝進來。

Q&A

Q:Debug模式為什麼編譯出錯,而Release模式可以?
A: Debug模式編譯完成qgis後執行發現有錯誤中斷到QCA庫的內部,經查詢原因應該是需要編譯debug版本時,要把依賴的qca,qwt,qtkeychain,QScintilla這幾個庫單獨編譯為debug版本。官網提供的庫只有release沒有debug版本,那怎樣編譯debug版本的程式呢,其實大家都知道debug編譯可以使用release版本的庫,只是如果是帶UI的庫,必須使用debug版本,否則就算編譯通過了執行qgis會崩潰。

Q:Could not load qgis_app.dll
A:缺少Qt5的相關庫,把相關庫拷貝的編譯的目錄之下問題解決;那4個第三方庫也要拷進來。

Q:編譯完成後qgis啟動不起來、系統圖示不顯示
A:執行的時候程式找不到正確支援圖示格式的庫檔案,需要將QT的plugins/imageformats和檔案拷貝的執行exe目錄之下。platforms這個目錄也需要拷貝過來,不然介面啟動不起來。

Q:Error LNK2019: 無法解析的外部符號 WinMain,MSVCRT.lib
A:由於QGis新建專案是控制檯應用程式,而程式通過的是WinMian(及windows入口函式),因此需要作下處理;解決方案見第五章節。

Q:qgis_gui專案中出現未定義的識別符號 "QWebElement"
A:Qt5.6起棄用QtWebKit,找不到該模組所致;解決方案見第五章節。

六、VS、QT、QGIS編譯中遇到的問題及解決方案

VS、Qt5.12、QGIS3.16問題彙總及處理方法,詳見我的另一篇隨筆:VS2019、Qt5.12及QGis3.16二次開發常見問題

七、建立一個基於VS2017+Qt5.12.10+QGIS3.16編譯環境的GIS應用程式

主要是呼叫上面Qt5.12.10編譯的QGIS3.16的dll、lib和h檔案,用VS+QT建立一個GIS應用程式。這裡要強調一點,早期的VS2017問題較多,用的Qt VS Tools外掛也不夠完善,使用最新的VS2017或VS2019體驗較好;Qt用5.12.x,和上面的庫保持一致。可以用QtCreator建立專案,也可以用VS建立專案。下面歸納下VS2017+Qt5.12.10建立一個基於QGIS3.16的GIS應用程式過程注意的事項。

  • C/C++附加的include目錄:

ui檔案生成的目錄、D:/QGIS/build1020及其src裡的幾個關鍵目錄(包括子目錄)、下載的qgis-3.16.6原始碼目錄src裡及上級目錄中的external及裡面的幾個關鍵目錄、D:/QGIS/thirdPartWithinQt5.12.10/include裡的幾個第三方庫目錄、Qt5.12.10的幾個用到的庫目錄(如:QtWidgets、QtCore、QtGui、QtNetwork、QtSvg、QtXml、QtPrintSupport等)。

  • Linker輸入的附件依賴:

qgis_core.lib、qgis_gui.lib、qgis_analysis.lib、qgis_app.lib、上述Qt5.12.10的debug版的幾個lib。

Q&A

Q: Error LNK2019: 無法解析的外部符號 WinMain,MSVCRT.lib是什麼緣故?
A: 方法一:見上方的“VS常見問題”;方法二:由於QGis新建專案是控制檯應用程式,而程式通過的是WinMian(及windows入口函式),因此需要作下處理:在“qgis_core專案”->“屬性”->“聯結器”->“輸入”附加依賴項中,debug版本新增D:\Qt\Qt5.12.10\msvc2017_64\qtmaind.lib,release版本則新增qtmain.lib。

Q:GisDemo,我能看下你的樣子嗎?
A:可以,先唱給你聽:

我聽到傳來的誰的聲音
像那夢裡嗚咽中的小河
我看到遠去的誰的步伐
遮住告別時哀傷的眼神
不明白的是為何你情願
讓風塵刻畫你的樣子
……

應用截圖如下:

image

 

相關文章