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

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

轉載請註明出處,本文地址:
//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源碼
//github.com/qgis/QGIS/releases

二、安裝Cygwin、OSGeo4W64,並下載QGIS開發所需文件

1、Cygwin
1.1 下載地址://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安裝包下載地址: //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版,參見下面的兩篇博文:

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

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

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

1、下載CMake工具並安裝,比如安裝在D盤。下載地址://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(下載地址是//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 //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