1. 程式人生 > >QGIS編譯--QGIS3.03+VS2017(64)+QT5.92原始碼編譯過程及二次開發準備經驗

QGIS編譯--QGIS3.03+VS2017(64)+QT5.92原始碼編譯過程及二次開發準備經驗

    已經3年沒有接觸編碼了,因專案需要,開始接觸QGIS。經過大半個十一長假,終於在各種文章及QGIS提供的幫助文件的支援下,實現了兩個目標:(1)將QGIS在QT+VS的開發環境下,呼叫執行起來,初步具備二次開發能力;(2)編譯QGIS原始碼,生成qgis.exe,從而能夠支援在二次開發的過程中,學習QGIS的程式碼。從學習過程來看,這是兩個相對獨立的過程,在實現這兩個目標的過程中,得到了QGIS先行者的各種經驗支援,但由於QGIS的版本不斷在升級,然後其和VS和QT的版本之間存在適配的問題,因此所有經驗都只能是啟發,這就意味著本文雖然主要是重複,但亦有存在意義。實現這兩個目標的過程,比較辛苦,現在想來都覺得不太想重複,為記錄自己的經驗,也為回饋先行者的分享,特寫下此文。

    1、二次開發環境準備

    1)搭建開發環境

    我用的是surface pro 5,硬體的計算能力算不得很好,軟體是Windows 10 專業版,以前沒有VS環境。

    2)下載相應軟體:

    (1)VS 2017下載

    微軟公司提供了VS 2017的各類版本下載,其中社群版是免費的,初步分析其功能已經足夠支援QGIS的學習,因此我下載使用的是 “社群版”。

    值得說明的是VS 2017的安裝是線上的,從上述網址下載的實際上是VS 2017的安裝器,並不是離線安裝包,因此正常安裝VS 2017需要連線網際網路,當然這對於大部分網友而言這不是難事。VS的安裝過程可參照

https://blog.csdn.net/qq_36556893/article/details/79430133

    當然,有網友整理了離線下載VS 2017的辦法https://blog.csdn.net/h8178/article/details/78280202,我試著照做了一下,選擇“VS 2017 社群版”,最終形成了一個47.3G的資料夾。檔案下載完成後,還沒有試著重新安裝一遍,是否可行有興趣的可以試驗後反饋一下。

    (2)QGIS的下載

    支援QGIS二次開發的下載包括兩種,一種是網路線上安裝程式OSGeo4W,另一種是QGIS獨立安裝程式。我先選擇的是獨立安裝程式,安裝完畢後,發現大部分網友的教程都是基於OSGeo4W來下載特定的庫,因此後來我又使用OSGeo4W再行安裝了一遍。個人感覺還是OSGeo4W更實用,想要什麼就找什麼,當然前提是你知道自己需要什麼。

    (3)Qt Visual Studio Tools的安裝

      執行安裝好了的VS 2017,在選擇選單欄“工具”→“擴充套件和更新”選單項後,彈出“擴充套件和更新”的對話方塊,在其中搜索qt後,選擇Qt Visual Studio Tools並下載。

    3)試著呼叫QGIS

    4)尋找“.shp”檔案並執行

    網上找到的.shp檔案,下載並解壓縮之後,就可以通過上述程式碼形成的程式開啟地圖了。

    2、QGIS原始碼編譯

    原始碼的編譯花了我好幾天的時間,最終成功編譯,殊為不易。

    2)在配置階段,執行CMake後,在Configure時,會要求選擇編譯器,如果OSGeo4W下載的64位的版本,一定要選擇Visual Studio 15 2017 X64,而不能選擇Visual Studio 15 2017,我就是因為選錯了,導致浪費了好多時間,花了很多的時間去除錯一些莫名其妙的bug。

    3)配置過程中,會檢測不同元件的版本是否符合要求。這個過程中如果確認自己所下載的版本是正確的,不妨註釋掉相應的檢測命令列,比如我在configure的時候,總是提醒我spatialite 需要version 4.2以上,實際上我通過OSGeo4W下載的是version 4.3的版本,經檢查標頭檔案spatialite.h裡面的註釋也是4.3的,多次下載重灌該元件後,試著把這部分檢測的命令列註釋掉,結果配置成功。

    4)在基於VS 2017編譯原始碼的過程中,專案實在是太多了,整體上編譯一遍似乎沒有必要,因此我參照先行者們的經驗,也只是留下的9個專案(參考https://blog.csdn.net/quinta_2018_01_09/article/details/79084001,當然在編譯過程中,根據需要後面又增加了一個專案qgis_native,不然即使是編譯過了,連結也存在問題。

    5)編譯過程中,我的經驗是一定要對QGIS的編碼質量有信心,不要一看編譯不過就信馬由繮地去根據自己的經驗來修改原始碼,而是多思考編譯器對程式碼的適應性問題。在編譯過程中,我對程式碼真正有效的修改是VS 2017對utf-8的識別問題,總是提醒程式碼中有換行符,以及由這個問題所引起的一序列其他的虛假問題。解決辦法是在Unicode字元後面,增加一個空格。這10個專案中的大部分專案都需要作如是處理,處理完畢之後,就可以運行了。