從2月19日開始打包,到2月23日,QGIS 3.18的安裝包經過漫長的4天才完成打包,在這等待的4天里,大家有沒有像我一樣萌生出自己動手編譯源代碼的想法呢?今天想分享的是QGIS3.18源代碼編譯的程序,并在最后整理出編譯程序遇到的錯誤和解決辦法,
01 編譯環境
-
作業系統
本次編譯選用Ubuntu 20.04作業系統,理由如下:
從第一個版本開始,QGIS大部分開發是在Linux環境下進行的,與Linux系統的兼容性更好(實際上,我在Windows系統也試著編譯過QGIS原始碼,編譯環境的安裝、編譯程序難度比在Linux系統大得多);
Ubuntu 20.04是一個與Windows系統相類似的、以桌面應用為主的Linux發行版本,對Linux新手來說比較符合操作習慣、易于上手,而且 20.04版本是Ubuntu的長期支持(LTS)版本,社區可提供5年的支持,比最新的20.10版穩定性和成熟度好很多,
-
其他編譯環境
CMake:3.16.3
Flex :2.6.4
Bison:3.5.1
Python:3.8.5
02 下載源代碼
建議將不同版本的QGIS源代碼用單獨的目錄存放,打開命令列終端,輸入如下命令,建立作業目錄并切換到該目錄:
mkdir -p ${HOME}/dev/QGIScd ${HOME}/dev/QGIS
下載源代碼:
wget https://github.com/qgis/QGIS/archive/final-3_18_0.tar.gz
解壓縮下載回來的代碼包:
tar -zxf QGIS-final-3_18_0.tar.gz
03 安裝依賴庫
從Ubuntu系統的左下角的開始選單打開一個命令列終端,參照github的“Building QGIS from source - step by step”檔案(https://github.com/qgis/QGIS/blob/master/INSTALL.md),輸入如下命令安裝QGIS編譯需要的依賴庫:
sudo apt-get install bison ca-certificates ccache cmake cmake-curses-gui dh-python doxygen expect flex flip gdal-bin git graphviz grass-dev libexiv2-dev libexpat1-dev libfcgi-dev libgdal-dev libgeos-dev libgsl-dev libpdal-dev libpq-dev libproj-dev libprotobuf-dev libqca-qt5-2-dev libqca-qt5-2-plugins libqscintilla2-qt5-dev libqt5opengl5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5webkit5-dev libqt5xmlpatterns5-dev libqwt-qt5-dev libspatialindex-dev libspatialite-dev libsqlite3-dev libsqlite3-mod-spatialite libyaml-tiny-perl libzip-dev libzstd-dev lighttpd locales ninja-build ocl-icd-opencl-dev opencl-headers pdal pkg-config poppler-utils protobuf-compiler pyqt5-dev pyqt5-dev-tools pyqt5.qsci-dev python3-all-dev python3-autopep8 python3-dateutil python3-dev python3-future python3-gdal python3-httplib2 python3-jinja2 python3-lxml python3-markupsafe python3-mock python3-nose2 python3-owslib python3-plotly python3-psycopg2 python3-pygments python3-pyproj python3-pyqt5 python3-pyqt5.qsci python3-pyqt5.qtsql python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-requests python3-sip python3-sip-dev python3-six python3-termcolor python3-tz python3-yaml qt3d-assimpsceneimport-plugin qt3d-defaultgeometryloader-plugin qt3d-gltfsceneio-plugin qt3d-scene2d-plugin qt3d5-dev qt5-default qt5keychain-dev qtbase5-dev qtbase5-private-dev qtpositioning5-dev qttools5-dev qttools5-dev-tools saga spawn-fcgi xauth xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xvfb
下載的時間視網路狀況而定,有時候會達到幾個小時,耐心等待就好,當所有軟體包下載完成后,系統匯總需要安裝的軟體包資訊,詢問是否繼續,輸入 “Y”,回車,并等待所有依賴庫安裝完成,

04 編譯
接下來開始編譯程序,依次執行如下命令,創建build目錄,執行ccmake:
cd QGIS-final-3_18_0mkdir build-mastercd build-masterccmake ..
ccmake是一個圖形化的配置界面,啟動后界面如下:

注意:“ccmake ..”命令后一定要加上兩個英文狀態的點,表示要讀取的CMakeLists.txt組態檔所在位置為當前目錄的上一級目錄,
按鍵盤“c”鍵,開始將CMakeLists.txt配置資訊讀取進來:

完成讀入后,配置項和默認取值將顯示在視窗中:

用鍵盤↑、↓箭頭在配置項之間移動,如果想修改一個配置項的取值,按“Enter”鍵,在右邊輸入要設定的值,再回車確認修改,
我們可以先最簡單的編譯開始,按默認配置繼續走下去,按鍵盤上的“c”鍵將配置生成快取(注意,這里可能需要多次按“c”鍵)直到下方出現“Press [g] to generate and exit”選項:

按鍵盤“g”鍵,生成本地化的makefile:

完成后將自動退出ccmake界面,回到命令列終端,輸入“make”命令,回車,開始編譯可執行檔案:

編譯程序需要耗費很長時間,有多種加快編譯的方法,例如,“make”命令后可加入處理器個數引數變為“make -j4”,4即處理器個數,多個處理器一起編譯將提高速度,

耐心等待進度顯示100%,此時我們完成了從源代碼編譯QGIS軟體的整個程序,但是默認設定不包含三維,我們將在下一節詳細討論如何將三維模塊加進來,

05 編譯三維模塊
默認配置中,三維模塊和3.18新增支持的記憶體資料庫SAP HANA模塊并沒有啟用,所以編譯完成后得到的QGIS不包含三維瀏覽和SAP HANA資料庫存盤功能,如果需要使用這兩個模塊,在ccmake的配置階段需將WITH_3D和WITH_HANA設定為“ON”,操作步驟為:
-
使用上下箭頭將游標移動到WITH_3D項,
-
按回車鍵,將右邊的取值從“OFF”切換到“ON”,
-
同樣的方法可設定WITH_HANA模塊,

因為QGIS的三維模塊需要Qt53DExtras的支持,加入額外的三維模塊將顯著增加編譯的難度,默認情況下Debian發行版本的Qt模塊中不包含Qt53DExtras,所以QGIS源代碼倉庫根目錄下的external/qt3dextra-headers子目錄自帶了Qt53DExtras相關頭檔案,
在QGIS源代碼編譯中啟用三維,需要配置5個編譯選項把相關檔案的路徑傳遞給編譯器:WITH_3D、CMAKE_PREFIX_PATH、QT5_3DEXTRA_INCLUDE_DIR、QT5_3DEXTRA_LIBRARY、Qt53DExtras_DIR,各選項的取值如下:
WITH_3D:TRUE;
CMAKE_PREFIX_PATH:{QGIS源代碼目錄}/external/qt3dextra-headers/cmake;
QT5_3DEXTRA_INCLUDE_DIR:{QGIS源代碼目錄}/external/qt3dextra-headers/;
QT5_3DEXTRA_LIBRARY:/usr/lib/x86_64-linux-gnu/libQt53DExtras.so;
Qt53DExtras_DIR:{QGIS源代碼目錄}/external/qt3dextra-headers/cmake/Qt53DExtras,
因為CMakeLists.txt中并沒有包含上述所有引數,所以不能使用圖形界面ccmake來配置引數,需要借助命令列的cmake命令,以我本次編譯為例,運行的cmake命令為:
cmake -DWITH_3D=TRUE -DCMAKE_PREFIX_PATH=/home/wujianling/dev/QGIS-final-3_18_0/QGIS-final-3_18_0/external/qt3dextra-headers/cmake -DQT5_3DEXTRA_INCLUDE_DIR=/home/wujianling/dev/QGIS-final-3_18_0/QGIS-final-3_18_0/external/qt3dextra-headers -DQT5_3DEXTRA_LIBRARY=/usr/lib/x86_64-linux-gnu/libQt53DExtras.so -DQt53DExtras_DIR=/home/wujianling/dev/QGIS-final-3_18_0/QGIS-final-3_18_0/external/qt3dextra-headers/cmake/Qt53DExtras ..

拷貝這個命令時,注意把所有路徑引數修改為自己電腦上對應路徑,否則將會出現找不到檔案的錯誤,另外,最后的兩個英文狀態的“..”不能省略!

完成配置后,使用“make”命令重新編譯生成QGIS可執行檔案,
注意:每次重新編譯,都需要使用“rm -f ./*”命令將build-master目錄下的所有之前編譯生成的快取清空,否則會遇到意想不到的錯誤,
06 運行編譯結果
在命令列終端運行“./output/bin/qgis”,將啟動剛編譯好的QGIS程式,當出現啟動界面時,是不是很激動?

點擊選單【View】,如果出現【New 3D Map View】子選單,點擊彈出三維瀏覽視窗,說明三維模塊已編譯成功,

07 出錯大全和解決辦法
這一節將列出這次編譯程序所遇到的所有報錯和解決辦法,避免大家踩到相同的坑,
-
安裝依賴庫可能出現的問題及解決辦法
權限不足
按照官網的編譯步驟,使用“ apt-get install”命令安裝依賴庫時,如果當前登陸Ubuntu系統的用戶不是root用戶,會出現權限不足,
解決辦法:在命令前加sudo,并按照提示輸入當前用戶的密碼(注意,不是root用戶的密碼!),
依賴庫下載失敗
這是最常見的問題,是網路連接不穩定導致,解決辦法是重新運行前面安裝依賴庫命令“ apt-get install …”,Ubuntu將會跳過已經下載的軟體包,將沒有成功下載的包補下回來,然后繼續安裝程序,

Lighttpd錯誤
報錯資訊如下:
Job for lighttpd.service failed because the control process exited with error code.
see "systemctl status lighttpd.service" and "journalctl -xe" for details.
invoke-rc.d:initscript lighttpd,action "start" failed.
這是lighttpd的一個bug,是由于lighttpd的配置中參考了gamin,而系統沒有安裝gamin引起,
安裝gamin可消除該錯誤,命令如下:
sudo apt-get install gamin
-
編譯中遇到的問題及解決辦法
警告:Policy CMP0075 is not set:Include file check macros honor CMAKE_REQUIRED_LIBRARIES.
這是檢查包含檔案宏(Include file check macros)在不同cmake版本的執行策略,在cmake 3.12及以上版本,包含檔案檢查宏使用CMAKE_REQUIRED_LIBRARIES變數,cmake 3.11以下版本則使用CheckIncludeFile模塊的check_include_file宏,
該警告在cmake 3.16.3版本可忽略,(但是不能保證將來的cmake版本仍然兼容),所以目前看到這個警告時,直接按“e”鍵繼續即可,

錯誤:找不到C++編譯器
報錯資訊:No CMAKE_CXX_COMPILER could be found,

這是因為Ubuntu 20.04默認沒有安裝g++編譯器,運行下面命令安裝:
sudo apt-get install build-essential
錯誤:找不到Qt53DExtras相關組態檔
報錯資訊:
Could not find a package configuration file provided by "Qt53DExtras" with any of the following names:
Qt53DExtrasConfig.cmake
qt53dextras-config.cmake

這是編譯三維模塊最常見錯誤,再次檢查三維配置的相關選項:CMAKE_PREFIX_PATH、QT5_3DEXTRA_INCLUDE_DIR、QT5_3DEXTRA_LIBRARY、Qt53DExtras_DIR,其中,Qt53DExtras_DIR配置項指向的目錄應包含Qt53DExtrasConfig.cmake或者qt53dextras-config.cmake,確保路徑正確并且路徑下包含這兩個檔案之一,
錯誤:找不到Qt5::3DExtras
報錯資訊:c++ error:Qt5::3DExtras-NOTFOUND: No such file or directory,
C++編譯進度到41%左右,如果出現c++ error:Qt5::3DExtras-NOTFOUND導致編譯失敗,則需要檢查三維相關選項:CMAKE_PREFIX_PATH、QT5_3DEXTRA_INCLUDE_DIR、QT5_3DEXTRA_LIBRARY,使用帶上述引數的“cmake”命令重新設定,確保指向的路徑正確,

錯誤:找不到Qt3DExtrax/QCuboidMesh
報錯資訊:fatal error:Qt3DExtras/QCuboidMesh:No such file or directory,
這是編譯進行到43%左右出現的錯誤,仍然是三維的問題,{QGIS源代碼目錄}/src/3d/qgsskyboxentity.h檔案參考了Qt3DExtras/QCuboidMesh檔案,然而/src/3d/目錄下并沒有Qt3DExtras/QCuboidMesh檔案,所以出現錯誤,

解決辦法是,到{QGIS源代碼目錄}/external/qt3dextra-headers/,將Qt3DExtras目錄拷貝到{QGIS源代碼目錄}/src/3d/目錄下,

QGIS 3.18源代碼編譯就介紹到這里,大家可以按照步驟試著編譯,也可以嘗試編譯其他版本的QGIS源代碼,編譯程序中遇到的問題歡迎關注公眾號并在后臺留言一起討論,


著作權宣告
本文歡迎轉載,轉載時請注明出處,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264584.html
標籤:其他
上一篇:Ubuntu20.04+cuda11.1+yolo3 目標檢測 深度學習系統 真正從0搭建 包含各種可能遇到的錯誤
