在中标麒麟上从源码编译QGIS 3.4.7:一份踩坑无数的依赖库安装指南
中标麒麟系统源码编译QGIS 3.4.7全攻略:依赖库管理与疑难解析
当国产操作系统遇上专业地理信息系统软件,技术适配往往成为一场充满挑战的探险。在中标麒麟这类基于安全优先设计的国产平台上,从源码构建QGIS这类复杂软件,更像是在解一道多维度的技术方程——需要同时考虑系统架构特性、依赖库版本兼容性以及编译工具链的协调。不同于Deepin、优麒麟等Debian系发行版可直接通过软件源安装,中标麒麟用户常需要直面"依赖地狱"的考验。
这份指南将彻底拆解QGIS 3.4.7在中标麒麟NeoKylin上的完整编译过程,特别聚焦那些官方文档未曾详述的依赖库陷阱。我们不仅提供可复现的操作步骤,更会深入分析每个关键依赖的版本选择逻辑,帮助开发者建立系统化的源码编译思维。以下技术方案已在搭载中标麒麟v7.0(基于Fedora 21)的龙芯3A4000平台验证通过,同样适用于x86架构版本。
1. 编译环境准备与基础工具链配置
中标麒麟默认搭载的GCC 4.9编译器仅支持C++11标准,这直接决定了我们选择QGIS 3.4.7而非更新版本——因为从QGIS 3.6开始需要C++17支持。在开始前,请确保系统已更新至最新状态:
sudo yum update -y sudo yum groupinstall -y "Development Tools"基础依赖安装清单(中标麒麟软件源可获取版本):
- 编译工具:cmake 2.8, automake 1.13, libtool 2.4
- 核心库:zlib 1.2, sqlite 3.7, libxml2 2.9
- Python环境:python2.7, python-devel(QGIS 3.4.7尚未完全迁移到Python3)
注意:中标麒麟默认Python环境可能存在路径配置问题,建议通过
alternatives --config python确保/usr/bin/python指向正确版本。
对于无法通过yum获取的较新工具,推荐从源码构建cmake 3.16+:
wget https://cmake.org/files/v3.16/cmake-3.16.9.tar.gz tar -xzf cmake-3.16.9.tar.gz cd cmake-3.16.9 ./bootstrap --prefix=/usr/local make -j$(nproc) sudo make install环境变量配置建议添加到~/.bashrc:
export PATH=/usr/local/bin:$PATH export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH2. 关键依赖库编译实战:Qt5与GDAL的定制化构建
2.1 Qt5框架的兼容性构建
QGIS 3.x系列对Qt5的依赖极为严格,官方推荐使用Qt 5.12 LTS版本。在中标麒麟上编译时需特别注意:
- 下载源码并配置基础选项:
wget https://download.qt.io/archive/qt/5.12/5.12.8/single/qt-everywhere-src-5.12.8.tar.xz tar -xJf qt-everywhere-src-5.12.8.tar.xz cd qt-everywhere-src-5.12.8- 关键配置参数(适配中标麒麟环境):
./configure -prefix /opt/Qt5.12.8 \ -opensource \ -confirm-license \ -nomake examples \ -nomake tests \ -qt-xcb \ -skip qtwebengine \ -xplatform linux-g++ \ -no-pch- 常见问题解决:
- GL/gl.h缺失:安装mesa相关开发包
sudo yum install mesa-libGL-devel - xcb依赖错误:
sudo yum install libxcb libxcb-devel xcb-util xcb-util-devel - icu库不匹配:禁用icu支持
-no-icu
编译完成后建议验证Qt5功能:
export QT5DIR=/opt/Qt5.12.8 $QT5DIR/bin/qmake -v # 应显示Qt 5.12.8版本信息2.2 GDAL地理数据抽象层构建
GDAL作为QGIS的核心数据引擎,其2.4.1版本与QGIS 3.4.7兼容性最佳。编译时需要特别关注Proj和Geos的版本配套:
wget https://github.com/OSGeo/gdal/releases/download/v2.4.1/gdal-2.4.1.tar.gz tar -xzf gdal-2.4.1.tar.gz cd gdal-2.4.1配置参数示例(假设Proj 7.2已安装在/usr/local):
./configure --prefix=/usr/local \ --with-proj=/usr/local \ --with-geos=/usr/local/bin/geos-config \ --with-sqlite3 \ --with-curl \ --with-xml2可能遇到的典型错误及解决方案:
| 错误类型 | 表现特征 | 解决方法 |
|---|---|---|
| Proj版本冲突 | 'proj_api.h' not found | 确保--with-proj指向正确安装路径 |
| Geos链接失败 | undefined reference to GEOS* | 检查geos-config路径是否在PATH中 |
| Python绑定问题 | gdal-config: not found | 安装python-gdal绑定sudo yum install gdal-python |
编译安装后建议运行验证测试:
gdalinfo --version # 应显示GDAL 2.4.1 ogrinfo --version # 检查OGR组件3. Python生态与地理空间库的适配
QGIS 3.4.7仍部分依赖Python 2.7环境,但建议同时配置Python 3.6+以支持未来扩展。关键Python依赖包括:
- PyQt5:必须与Qt5主版本严格匹配(5.12)
- QScintilla:代码编辑组件,需要2.11.x系列
- SIP:PyQt的绑定工具,推荐4.19.25
通过pip安装时需指定版本:
pip2 install PyQt5==5.12.3 QScintilla==2.11.6 SIP==4.19.25地理空间相关Python库的版本要求:
| 库名称 | 推荐版本 | 备注 |
|---|---|---|
| numpy | 1.16.6 | 最后一个支持Py2.7的稳定版 |
| psycopg2 | 2.8.6 | PostgreSQL连接适配 |
| pyproj | 1.9.6 | 需与Proj库版本匹配 |
| matplotlib | 2.2.5 | 绘图支持 |
重要提示:中标麒麟默认的Python路径可能被系统工具依赖,建议使用virtualenv创建独立环境:
virtualenv -p /usr/bin/python2.7 /opt/qgis_python source /opt/qgis_python/bin/activate4. QGIS本体编译与系统集成
完成所有依赖准备后,QGIS本体的编译相对直接,但有几个关键配置点需要注意:
- 获取源码并创建构建目录:
wget https://github.com/qgis/QGIS/archive/final-3_4_7.tar.gz tar -xzf final-3_4_7.tar.gz mkdir QGIS-build && cd QGIS-build- CMake配置示例(需根据实际路径调整):
cmake ../QGIS-final-3_4_7 \ -DCMAKE_INSTALL_PREFIX=/opt/qgis-3.4.7 \ -DQT5_DIR=/opt/Qt5.12.8/lib/cmake/Qt5 \ -DPYTHON_EXECUTABLE=/opt/qgis_python/bin/python \ -DGDAL_CONFIG=/usr/local/bin/gdal-config \ -DGEOS_CONFIG=/usr/local/bin/geos-config \ -DWITH_3D=ON \ -DWITH_GRASS=OFF \ -DWITH_SERVER=OFF- 编译优化技巧:
- 使用ccache加速后续编译:
-DUSE_CCACHE=ON - 控制并行编译线程数:
make -j$(($(nproc)-1)) - 分离调试信息:
strip --strip-unneeded output/bin/qgis
安装后的系统集成工作:
- 创建桌面快捷方式(/usr/share/applications/qgis.desktop):
[Desktop Entry] Name=QGIS 3.4.7 Exec=/opt/qgis-3.4.7/bin/qgis Icon=/opt/qgis-3.4.7/share/qgis/images/icons/qgis-icon.png Type=Application Categories=GIS;Science;- 环境变量配置(/etc/profile.d/qgis.sh):
export PATH=/opt/qgis-3.4.7/bin:$PATH export LD_LIBRARY_PATH=/opt/qgis-3.4.7/lib:$LD_LIBRARY_PATH export QT_PLUGIN_PATH=/opt/qgis-3.4.7/lib/qt/plugins5. 常见编译错误诊断与修复方案
在中标麒麟平台上编译QGIS时,以下几个典型问题值得特别关注:
5.1 符号链接冲突问题
表现:libQt5Core.so.5: version 'Qt_5.12' not found解决方案:
sudo ldconfig -v | grep Qt5 # 检查链接情况 # 若存在冲突,手动创建正确链接 sudo ln -sf /opt/Qt5.12.8/lib/libQt5Core.so.5 /usr/lib64/5.2 Proj6+ API变更导致的兼容性问题
QGIS 3.4.7设计时基于Proj 4.x API,与Proj 7.x存在不兼容。临时解决方案:
cd /usr/local/include ln -s proj.h proj_api.h # 创建API兼容层5.3 Python模块导入错误
当出现ImportError: No module named qgis._core时,检查:
- PYTHONPATH是否包含/opt/qgis-3.4.7/share/qgis/python
- Python版本是否与编译时一致
5.4 图形渲染异常
如果QGIS界面出现元素渲染错乱,尝试:
export QT_DEBUG_PLUGINS=1 # 查看插件加载情况 export QT_QPA_PLATFORM=xcb # 强制使用XCB平台6. 性能优化与后续维护建议
成功编译只是开始,要让QGIS在中标麒麟上稳定运行还需以下优化:
内存管理:
- 修改QGIS启动脚本,添加JVM参数:
export QGIS_OPTIONS_PATH=/opt/qgis-3.4.7/resources export QGIS_DISABLE_MMAP=1 # 禁用内存映射提升稳定性
- 修改QGIS启动脚本,添加JVM参数:
渲染加速:
- 在设置→选项中启用"使用硬件加速渲染"
- 配置QT_GRAPHICSSYSTEM=opengl环境变量
依赖库更新策略:
- 使用ldd检查二进制文件依赖关系:
ldd /opt/qgis-3.4.7/bin/qgis | grep "not found" - 建立本地yum仓库管理自定义编译的rpm包
- 使用ldd检查二进制文件依赖关系:
崩溃诊断:
- 启用核心转储:
ulimit -c unlimited echo "/tmp/core.%e.%p" > /proc/sys/kernel/core_pattern - 使用gdb分析崩溃现场:
gdb /opt/qgis-3.4.7/bin/qgis /tmp/core.qgis.12345
- 启用核心转储:
对于长期维护,建议建立自动化编译脚本,将关键步骤如依赖检测、版本验证、编译安装等流程固化。同时保持与中标麒麟系统更新的同步测试,特别是在进行安全补丁更新后,需重新验证QGIS核心功能。
