https://blog.csdn.net/qq_34357717/article/details/81305084
簡介
QGIS是一個免費的、開源的、跨平台(LIN/WIN/Mac)的地理信息系統(GIS),有簡單、體積小、硬件要求低等特性,適合用於GIS的開發。作為開源項目,我們可以在GitHub上很輕松的找到QGIS的源碼。QGIS和很多開源項目一樣,使用CMAKE進行編譯,這其中就會涉及到一些困難的地方。
注意
無論是這篇博客或是其他地方的博客,隨着時間的推移和QGIS源碼的更新,難免會和官方產生脫節,例如依賴庫的版本不一樣,這時如果像筆者一樣照着舊版本的博客做,很可能在編譯中出現各種麻煩的問題,因此,建議一切以官方教程為准。筆者下文所提及的內容,都是以2018年7月20日的文檔內容作為參考的。
官方教程很重要
在GitHub上可以找到QGIS項目的主頁(https://github.com/qgis)
首先需要將整個項目下載下來
然后利用notepad++等軟件,打開根目錄中的INSTALL文件,當然直接在瀏覽器中打開也是可以的。
英文好的同學直接對着這個文檔基本上可以完成編譯了, 當然筆者也還是把自己的經驗總結在了下面。
環境配置過程
下載所需內容
QGIS可以在linux上編譯,但基於使用習慣,筆者使用window10平台進行編譯。首先,IDE我們肯定是選用微軟的visual Studio,和教程中使用VS2015稍有不同的是,筆者在這里使用的是VS2017。當然,還是要用到VC++2015的庫,這個一般情況下是不帶了,需要修改VS的功能,添加相應的工具集。
然后需要從連接中下載以下軟件包(筆者統一使用的是64位的版本):
| Tool | | | Website | |
| CMake | | https://cmake.org/files/v3.7/cmake-3.7.2-win64-x64.msi |
| cygwin | | http://cygwin.com/setup-x86.exe (32bit) or http://cygwin.com/setup-x86_64.exe (64bit) |
| OSGeo4W | | http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe (32bit) or http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe (64bit) | |
| ninja | | https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip |
對於cygwin和OSGeo4W,下載完后都是選擇高級安裝。
從網絡下載
當然路徑避免出現中文或符號,如非安裝在默認路徑,建議新建一個文件夾把這些包整理到一起,方便查找需要的內容。
文件下載路徑不怎么關鍵,只是暫時存放而已,默認就行
連接方法,有代理用代理,沒有直接選直連也沒什么問題,當然下載速度可能受到影響。
下載站點也是隨便選,如果速度實在太慢的話也可以嘗試換一個。
在選包界面的搜索欄輸入文檔中給出的包名,目前官方文檔給出的是:
cygwin:
- bison
- flex
- git(其實git到不是這么必要,當然下載多一個也沒什么問題)
OSGeo4W:
- qgis-rel-deps
另外之后編譯的過程中如果發現有缺失的包也是可以重新在這里補充下載的。
直接下一步完成安裝即可。
安裝完cygwin和OSGeo4W后,講ninja.exe復制到之前安裝OSGeo4W目錄的OSGeo4W64\bin\下。、
編譯源碼
找到OSGeo4W的安裝路徑,在下面新建一個文本文檔,輸入並修改紅色字體部分為你的源碼路徑。
@echo off
call X:\src\qgis\ms-windows\osgeo4w\msvc-env.bat x86_64
@cmd
-
@echo off
-
call X:\src\qgis\ms-windows\osgeo4w\msvc-env.bat x86_64
-
@cmd
(【X:\src\qgis】即從GitHub上下載的源碼包解壓后的位置,實在找不到也可以試試搜索msvc-env.bat這個文件然后根據其路徑修改)
將這個文本文檔的文件名修改為【OSGeo4W-dev.bat】保存在OSGeo4W的安裝目錄下,然后運行它。
這是官方文檔給出的方法,但是如果直接照做,之前的安裝路徑又有所修改的話,很可能會報錯,例如找不到文件,其實這是因為環境變量沒有修改的原因,其實官方文檔的方法就是直接調用了msvc-dev.bat這個批處理文件而已,根據這個提示右鍵編輯查看msvc-dev.bat這個文件。
-
@echo off
-
REM ***************************************************************************
-
REM msvc-env.cmd
-
REM ---------------------
-
REM begin : June 2018
-
REM copyright : (C) 2018 by Juergen E. Fischer
-
REM email : jef at norbit dot de
-
REM ***************************************************************************
-
REM * *
-
REM * This program is free software; you can redistribute it and/or modify *
-
REM * it under the terms of the GNU General Public License as published by *
-
REM * the Free Software Foundation; either version 2 of the License, or *
-
REM * (at your option) any later version. *
-
REM * *
-
REM ***************************************************************************
-
-
set ARCH=%1
-
if not "%ARCH%"=="x86" if not "%ARCH%"=="x86_64" (
-
goto usage
-
)
-
-
if "%OSGEO4W_ROOT%"=="" (
-
if "%ARCH%"=="x86" (
-
set OSGEO4W_ROOT=C:\OSGeo4W
-
set VCARCH=x86
-
) else (
-
set OSGEO4W_ROOT=C:\OSGeo4W64
-
set VCARCH=amd64
-
)
-
)
-
-
if not exist "%OSGEO4W_ROOT%\bin\o4w_env.bat" (echo o4w_env.bat not found & goto error)
-
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
-
call "%OSGEO4W_ROOT%\bin\py3_env.bat"
-
call "%OSGEO4W_ROOT%\bin\qt5_env.bat"
-
-
if not "%PROGRAMFILES(X86)%"=="" set PF86=%PROGRAMFILES(X86)%
-
if "%PF86%"=="" set PF86=%PROGRAMFILES%
-
if "%PF86%"=="" (echo PROGRAMFILES not set & goto error)
-
-
set VS140COMNTOOLS=%PF86%\Microsoft Visual Studio 14.0\Common7\Tools\
-
call "%PF86%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %VCARCH%
-
path %path%;%PF86%\Microsoft Visual Studio 14.0\VC\bin
-
-
set GRASS7=
-
if exist %OSGEO4W_ROOT%\bin\grass72.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass72.bat
-
if exist %OSGEO4W_ROOT%\bin\grass74.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass74.bat
-
if "%GRASS7%"=="" (echo GRASS7 not found & goto error)
-
for /f "usebackq tokens=1" %%a in (`%GRASS7% --config path`) do set GRASS_PREFIX=%%a
-
-
set PYTHONPATH=
-
if exist "%PROGRAMFILES%\CMake\bin" path %PATH%;%PROGRAMFILES%\CMake\bin
-
if exist "%PF86%\CMake\bin" path %PATH%;%PF86%\CMake\bin
-
if exist c:\cygwin64\bin path %PATH%;c:\cygwin64\bin
-
if exist c:\cygwin\bin path %PATH%;c:\cygwin\bin
-
path
-
-
set LIB=%LIB%;%OSGEO4W_ROOT%\apps\Qt5\lib;%OSGEO4W_ROOT%\lib
-
set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\apps\Qt5\include;%OSGEO4W_ROOT%\include
-
-
goto end
-
-
:usage
-
echo usage: % 0 arch
-
echo sample: % 0 x86_64
-
exit /b 1
-
-
: error
-
echo ENV ERROR %ERRORLEVEL%: %DATE% %TIME%
-
exit /b 1
-
-
: end
不難發現,其中涉及到的重要的環境變量主要有:
OSGEO4W_ROOT(OSGeo4W的根目錄)
PF86(軟件默認安裝目錄)
VS140COMNTOOLS(調用VS的vcvarsall.bat批處理文件)
GRASS7(這個的路徑中是【/】而不是【\】,要注意)
PYTHONPATH(SIP包所在路徑)
LIB(OSGeo4W依賴庫頭文件)
INCLUDE(OSGeo4W靜態庫文件)
如果之前更改了路徑,修改相應的環境變量即可。
其中,VS140COMNTOOLS是VS2015的變量名,如果是像筆者一樣使用VS2017的話,還需要將變量名VS140COMNTOOLS改為VS150COMNTOOLS。
修改方法:
1、利用批處理文件修改
創建一個文本文件,命名path.bat,內容參考如下,路徑換成相應安裝路徑即可,找不到可以搜索一下
-
@echo off
-
set VS150COMNTOOLS = C:\Program Files (x86)\Microsoft Visual Studio\ 2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
-
-
set OSGEO4W_ROOT=E:\QGISdevelop\OSGeo4W64
-
call "%OSGEO4W_ROOT%\bin\o4w_env.bat"
-
path %PATH%;E:\QGISdevelop\CMAKE\bin;E:\QGISdevelop\cygwin\bin;E:\QGISdevelop\OSGeo4W64\apps\Python36
-
-
@set GRASS_PREFIX=E:/QGISdevelop/OSGeo4W64/apps/grass/grass-7.4.1
-
@set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\include
-
@set LIB=%LIB%;%OSGEO4W_ROOT%\lib;%OSGEO4W_ROOT%\lib
-
-
@cmd
在CMD中運行這個BAT
2、右鍵此電腦→屬性→高級系統設置→高級→環境變量。
一個一個變量添加或者更改。
3、備份msvc-dev.bat后直接修改里面的相關路徑,然后再次運行msvc-dev.bat
通過以上3種方法設置完環境變量之后,官方的教程會講用git下載源碼,如果之前下載過就可以忽略這一步了
接下來是具體的編譯了,官方提供了兩種方法,使用Trugonly.cmd創建MSVC解決方案文件或者使用cmake-gui
由於各種路徑設置的原因,筆者建議還是使用傳統的cmake進行編譯
打開之前創建的OSGeo4W-dev.bat
打開cmake-gui,設置好源碼路徑和要輸出的路徑,然后點擊Configure
另外在CMAKE卡中設置項目要安裝的路徑,推薦設置在一個新的空目錄中,避免導致混亂
出現錯誤也是正常的,關鍵還是路徑的問題,所以說前面環境變量的設置十分重要。另外在WITH中去掉一些不必要的組件,最最最重要的是DESKTOP,然后就是GUI等一些組件,當然直接使用默認的也基本上可以了。
一步一步的指定缺失的路徑,首先是flex和bison
然后是各個庫
我遇到了這個spatialite版本過舊的問題
這時再次打開之前的OSGeo4W安裝程序,搜索這個包並進行安裝
問題還是沒有解決,這時才發現原來是版本選成了VS17的,這里還是要選擇VS2015 64位的版本
設置完成后繼續點Configure,有錯誤則設置好需要的路徑直到出現
然后點擊Generate,其實這三個按鈕點依次點過去,沒問題的話就OK了,成功的話可以在指定的文件夾中看到編譯成功的項目,用VS打開項目並且重新生成就可以了,當然這可能需要比較長的一段時間。
將活動解決方案設置為RelWithDebInfo,帶有調試信息的Release版本。
將啟動項目設置成【qgis】,選擇核心的項目生成即可,這里我參考了https://blog.csdn.net/quinta_2018_01_09/article/details/79084001這篇博客。但通過查看看依賴項我發現【qgis】還需要依賴【qgis_native】這個項目,因此也把它加上去了。
然后單獨編譯生成【qgis_core】,如果出現以下問題,定位到出問題的cpp文件,利用記事本對其進行編輯(其他方法亦可),將其編碼改為【Unicode】,雖然錯誤看起來很多,但是實際上幾條錯誤都是在同一個文件中的,實際上需要修改的文件並不多,逐一修改即可。成功生成【qgis_core】后,生成其它項目,出現語法錯誤處理方式同上,最后生成【qgis】項目。
以上是筆者個人進行QGIS編譯的一些經驗,歡迎交流指導