由於工作要求,今年需要基於Qt搞跨平台的GIS。前期未曾接觸過Qt,最近也簡單學習了下,開源的QGIS是非常不錯的學習資源,下了最新版的QGIS源碼,不過在VS2015下卻沒法直接打開。網上查了很多資料,借鑒了很多前輩的經驗(大部分文檔QGIS源碼的版本都比較老)。雖然過程很艱辛,不過最后總算編譯成功且能運行了,心里倍激動。廢話不多說,趕緊上干貨,具體如下:
一、資源准備
1、QGIS 2.18.15源碼:
地址:qgis-latest.tar.bz2(2018.01.19已更新到2.18.16,由於我18號下的,所以文中的針對的是2.18.15版本源碼的,后續的編譯應該差不多);
2、Qt 5.9.3:
地址:qt-enterprise-windows-x86-5.9.3(如果鏈接下載不了,請去官方地址下載,只用下載msvc2015_64即可,我用的是VS2015編譯64位的);
3、VS2015:
這個就自己去下載安裝了,比較簡單(記得勾選VC++);另外,可以通過VS自帶的工具和擴展,下載Qt插件,QtPackage,然后把Qt5.9.3下的msvc2015_64設置過去就行;
4、CMake:
5、cygwin(主要用於下載flex及bison):
說明:(1)View選擇Category;(2)Search輸入要下載的內容,本工具只用下載flex和bison;(3)選擇Devel,展開,如果當前未下載則顯示的是"Skip",點擊會變成具體的版本,然后點擊下一步即可下載(由於我這邊都下過了,所以顯示的是keep)。按照這里的說明,分別下載flex和bison即可;(4)上述路徑不要有中文或空格。
6、osgeo4w(主要用於下載gdal等):
說明:(1)這里的操作和Cygwin基本一致;(2)Search輸入要下載的內容,具體包括:expat、fcgi、gdal、grass、gsl-devel、iconv、libspatialindex-devel、pyqt5、python3-devel、python3-qscintilla、python3-nose2、python3-future、python3-pyyaml、python3-mock、qca-qt5-devel、qca-qt5-libs、qscintilla-qt5、qt5-devel、qt5-libs-debug、qtwebkit-qt5-devel、qtwebkit-qt5-libs-debug、qwt-devel-qt5、sip-qt5、spatialite、qjson;(3)上述路徑不要有中文或空格。
二、編譯過程
1、制作bat設置環境變量:
先貼我這邊的bat文件,保存成path.bat(隨便命名就行)
@echo off set VS140COMNTOOLS = C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\ call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 set INCLUDE=%INCLUDE%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include set LIB=%LIB%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib set OSGEO4W_ROOT=C:\QGIS\OSGeo4W64 call "%OSGEO4W_ROOT%\bin\o4w_env.bat" path %PATH%;D:\Program Files\CMake\bin;C:\QGIS\cygwin64\bin;C:\QGIS\OSGeo4W64\apps\Python36 @set GRASS_PREFIX=C:/QGIS/OSGeo4W64/apps/grass/grass-7.2.2 @set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include @set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib
@cmd
說明:(1)VS140COMNTOOLS表示VS15,call后續跟的X64表示64位編譯;(2)Include表示頭文件,這里加了Win10系統的sdk;Lib表示編譯的動態庫;(3)Path表示環境變量;(4)特別注意:GRASS_PREFIX的路徑地址必須是“/”,Path路徑多個;之間不能有空格。
2、啟動Cmake進行配置:
點擊:Configure,如果遇到錯誤,則解決(手動配置路徑即可),以下是我這邊配置的最終圖:
最終配置完成后,沒有錯誤,圖如下:
3、CMake生成解決方案:
4、啟動VS編譯解決方案:
打開解決方案后,默認有好幾百個工程,編譯太廢勁,我這邊只保留了以下幾個,不用的都刪了(后續若需要,則再加),選擇RelWithDebInfo方式編譯:
說明:
(1)優先編譯qgis_core,此工程編譯通過后,再編譯其他的;
(2)編譯過程中proj.lib相關報錯,將名稱換成proj_i.lib即可;
(3)找不到 <netinet/in.h>,注釋掉即可;
(4)編譯qgis工程qtmain.lib報錯的解決,更換地址采用5.9.3的
全部編譯后,位於output目錄下,最終編譯后截圖如下:
5、啟動自己編譯的Qt軟件:
將OSGeo4W64\apps\Qt5\bin下的dll全部拷貝到同目錄下,啟動qgis.exe,會報錯如下:
此時,只需將OSGeo4W64\apps\Qt5\plugins文件下的platforms文件夾拷貝到剛才的目錄即可,截圖如下:
最終啟動qgis.exe,效果圖如下(部分圖標沒有,功能不全,后續可逐漸加入其他工程編譯)