QGIS原始碼編譯步驟詳解——官方新方案
阿新 • • 發佈:2022-04-02
目錄
方案詳細可見原始碼檔案中INSTALL.md。
原始碼下載
QGIS原始碼下載:https://github.com/qgis/QGIS/releases
建議3.16版本,本文原始碼版本3.16.3。
3.22版本編譯後會出現大量關於inline的錯誤,暫時不知如何解決。
環境下載
Cygwin64
- 下載Cygwin64安裝包,setup-x86_64.exe。
- 安裝Cygwin64,並安裝Flex、Bison。
Flex >= 2.5.6
Bison >= 2.4
OSGeo4W
- 下載OSGeo4W安裝包,setup-x86_64.exe。
- 安裝OSGeo4W,並安裝QGIS依賴環境qgis-dev-deps或qgis-ltr-dev-deps,本文安裝的3.13.0版本。
注:官方源現在只能下到3.22以上版本的依賴環境,環境的內容、版本、路徑都發生了比較大的改變,與老版本的原始碼相容性不好, 依賴環境建議qgis3.16及以下。武大源可以安裝3.13.0版本的依賴環境:http://gwmodel.whu.edu.cn/mirrors/osgeo4w
CMAKE
- 下載安裝CMake。https://cmake.org/download/
本文Cmake3.22.3
Visual Studio 2017
-
下載安裝Visual Studio
2017。https://visualstudio.microsoft.com/zh-hans/downloads/ -
安裝C++桌面開發元件。除預設的以外,還需安裝Windows 10 SDK(10.0.14393.0) ,會用到SetupAPI.Lib。
注:建議Visual Studio 2017。Visual Studio 2015可能會出現fatal error C1001: 編譯器中發生內部錯誤。
環境配置
- 移動到原始碼檔案的的F:\QGIS-final-3_16_3\ms-windows\osgeo4w目錄下。
- 開啟msvc-env.bat(可用vs code),將其中的Visual
Studio、OSGEO4W、CMake、Cygwin64的相關路徑修改為上述軟體在自己裝置上實際的路徑。主要修改路徑如下:
:x86_64
set VCARCH=amd64
set CMAKE_COMPILER_PATH=E:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64
set DBGHLP_PATH=E:\Microsoft Visual Studio\2017\Community\Common7\IDE\Remote Debugger\x64
set SETUPAPI_LIBRARY=C:\Program Files (x86)\Windows Kits\10\Lib\%VCSDK%\um\x64\SetupAPI.Lib
############################################################
if "%OSGEO4W_ROOT%"=="" if "%ARCH%"=="x86" (
set OSGEO4W_ROOT=E:\OSGeo4W
) else (
set OSGEO4W_ROOT=E:\OSGeo4W
)
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"
############################################################
set VS150COMNTOOLS=E:\Microsoft Visual Studio\2017\Community\Common7\Tools
call "E:\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" %VCARCH%
path %path%;E:\Microsoft Visual Studio 14.0\VC\bin
set GRASS7=
if exist %OSGEO4W_ROOT%\bin\grass74.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass74.bat
if exist %OSGEO4W_ROOT%\bin\grass76.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass76.bat
if exist %OSGEO4W_ROOT%\bin\grass78.bat set GRASS7=%OSGEO4W_ROOT%\bin\grass78.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 "E:\CMake\bin" path %PATH%;E:\CMake\bin
if exist "E:\CMake\bin" path %PATH%;E:\CMake\bin
if exist E:\cygwin64\bin path %PATH%;E:\cygwin64\bin
if exist E:\cygwin\bin path %PATH%;E:\cygwin\bin
set LIB=%LIB%;%OSGEO4W_ROOT%\apps\Qt5\lib;%OSGEO4W_ROOT%\lib
set INCLUDE=%INCLUDE%;%OSGEO4W_ROOT%\apps\Qt5\include;%OSGEO4W_ROOT%\include
############################################################
##構建時可能會找不到gdal304.dll和proj_8_2.dll,而報error MSB6006: “cmd.exe”已退出,程式碼為 -1073741515,因此新增下述gdal和proj環境路徑。
############################################################
path %path%;E:\OSGeo4W\apps\gdal-dev\bin
path %path%;E:\OSGeo4W\apps\proj-dev\bin
- 開啟package-nightly.cmd(可用vs code),修改qgis依賴庫路徑。主要關注下面的路徑是否有錯:
%O4W_ROOT%和%OSGEO4W_ROOT%都為OSGeo4W路徑。
-D PROJ_LIBRARY=%O4W_ROOT%/apps/proj-dev/lib/proj.lib ^
-D PROJ_INCLUDE_DIR=%O4W_ROOT%/apps/proj-dev/include ^
-D GDAL_LIBRARY=%O4W_ROOT%/apps/gdal-dev/lib/gdal_i.lib ^
-D GDAL_INCLUDE_DIR=%O4W_ROOT%/apps/gdal-dev/include ^
-D GEOS_LIBRARY=%O4W_ROOT%/lib/geos_c.lib ^
-D SQLITE3_LIBRARY=%O4W_ROOT%/lib/sqlite3_i.lib ^
-D SPATIALITE_LIBRARY=%O4W_ROOT%/lib/spatialite_i.lib ^
-D PYTHON_EXECUTABLE=%O4W_ROOT%/bin/python3.exe ^
-D SIP_BINARY_PATH=%PYTHONHOME:\=/%/sip.exe ^
-D PYTHON_INCLUDE_PATH=%PYTHONHOME:\=/%/include ^
-D PYTHON_LIBRARY=%PYTHONHOME:\=/%/libs/%PYVER%.lib ^
-D QT_LIBRARY_DIR=%O4W_ROOT%/lib ^
-D QT_HEADERS_DIR=%O4W_ROOT%/apps/qt5/include ^
-D CMAKE_INSTALL_PREFIX=%O4W_ROOT%/apps/%PACKAGENAME% ^
-D FCGI_INCLUDE_DIR=%O4W_ROOT%/include ^
-D FCGI_LIBRARY=%O4W_ROOT%/lib/libfcgi.lib ^
-D QCA_INCLUDE_DIR=%OSGEO4W_ROOT%\apps\Qt5\include\QtCrypto ^
-D QCA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qca-qt5.lib ^
-D QSCINTILLA_LIBRARY=%OSGEO4W_ROOT%\apps\Qt5\lib\qscintilla2.lib ^
- 在OSGeo4W路徑下建立批處理檔案OSGeo4W-dev.bat和OSGeo4W-vs.bat
## OSGeo4W-dev.bat(初始化環境),新增內容如下:
@echo off
call F:\QGIS-final-3_16_3\ms-windows\osgeo4w\msvc-env.bat x86_64
@cmd
## OSGeo4W-vs.bat (初始化環境,並在環境下執行vs2017),新增內容如下:
@echo off
call F:\QGIS-final-3_16_3\ms-windows\osgeo4w\msvc-env.bat x86_64
call "E:\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe"
@cmd
配置
- 執行OSGeo4W-dev.bat初始化環境。
- 跳轉到原始碼目錄。
- 執行configonly.bat。
cd F:\QGIS-final-3_16_3\ms-windows\osgeo4w
configonly.bat
等待配置,若結果為completely,且在原始碼目錄F:\QGIS-final-3_16_3\ms-windows\osgeo4w下生成了build-qgis-test-x86_64資料夾,則說明配置成功。
編譯
- 執行OSGeo4W-vs.bat,初始化環境並在環境下執行vs2017。
- 開啟qgis.sln,在F:\QGIS-final-3_16_3\ms-windows\osgeo4w\build-qgis-test-x86_64目錄下。
- 在RelWithDebInfo模式下進行編譯ALL_BUILD。
- 編譯完成後除錯qgis專案,執行成功,則編譯完成。