银河麒麟V10编译QGIS 3.26实战:从环境配置到成功运行的完整指南

寒泊

1. 银河麒麟V10与QGIS 3.26环境准备

在银河麒麟V10上编译QGIS 3.26之前,我们需要先做好系统环境的准备工作。银河麒麟作为国产操作系统的代表,其安全机制和软件生态与常见的Linux发行版有些许差异,这也是为什么我们需要特别注意一些细节。

首先确认系统版本,打开终端输入:

bash复制cat /etc/os-release

应该能看到类似"Kylin V10"的标识。我建议使用官方镜像全新安装系统,避免之前安装的软件带来干扰。实测中发现,银河麒麟默认的安全策略可能会影响编译过程,我们需要先调整安全等级:

bash复制sudo setstatus Softmode
sudo getstatus

这个操作相当于暂时降低了系统的安全防护级别,让编译过程能够顺利进行。记得编译完成后可以恢复默认安全等级。

接下来是编译器环境的搭建。银河麒麟默认没有安装g++,我们需要手动安装:

bash复制sudo apt-get update
sudo apt-get install build-essential

这里有个小技巧:如果遇到软件源速度慢的问题,可以尝试更换为国内镜像源。编辑/etc/apt/sources.list文件,将官方源替换为清华或阿里云的镜像源,能显著提升下载速度。

2. 源码获取与依赖安装

QGIS 3.26的源码可以从GitHub直接获取。我建议创建一个专门的工作目录来管理所有相关文件:

bash复制mkdir -p ${HOME}/dev/QGIS
cd ${HOME}/dev/QGIS
wget https://github.com/qgis/QGIS/archive/final-3_26_0.tar.gz
tar -zxf QGIS-final-3_26_0.tar.gz

使用wget下载比浏览器下载更可靠,特别是大文件时不容易出错。解压后你会得到一个QGIS-final-3_26_0目录,这就是我们的工作基础。

依赖库的安装是最容易出问题的环节。银河麒麟V10的软件源可能缺少某些包,或者版本不匹配。以下是经过验证可用的完整依赖列表:

bash复制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

这个命令看起来很长,但非常重要。建议复制到文本编辑器中检查无误后再执行。安装过程可能需要15-30分钟,取决于你的网络速度。

3. Python环境配置

Python版本问题是编译QGIS时最常见的坑之一。银河麒麟V10默认安装的是Python 3.8.10,但QGIS 3.26可能无法正确识别这个版本。经过多次测试,我发现Python 3.7.x版本兼容性最好。

下面是安装Python 3.7的完整步骤:

bash复制sudo apt update
sudo apt install build-essential zlib1g-dev libbz2-dev libncurses5-dev \
libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
wget -c https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz
tar -xzvf Python-3.7.4.tgz
cd Python-3.7.4
./configure --prefix=/usr/local/src/python37
make -j$(nproc)
sudo make install

安装完成后,我们需要设置系统默认的Python版本:

bash复制sudo ln -s /usr/local/src/python37/bin/python3.7 /usr/bin/python3.7
sudo ln -s /usr/local/src/python37/bin/pip3.7 /usr/bin/pip3.7
sudo rm -rf /usr/bin/python3
sudo ln -s /usr/local/src/python37/bin/python3.7 /usr/bin/python3
sudo ln -s /usr/local/src/python37/bin/pip3.7 /usr/bin/pip3

这些命令做了以下几件事:

  1. 创建了python3.7和pip3.7的符号链接
  2. 将系统默认的python3指向我们新安装的3.7版本
  3. 确保pip3也对应正确的版本

验证安装是否成功:

bash复制python3 --version
pip3 --version

应该显示Python 3.7.4和对应的pip版本。这一步非常关键,很多编译错误都是因为Python版本不匹配导致的。

4. 编译配置与构建

一切准备就绪后,就可以开始编译QGIS了。首先进入源码目录并创建构建目录:

bash复制cd ${HOME}/dev/QGIS/QGIS-final-3_26_0
mkdir build-master
cd build-master

使用ccmake进行交互式配置:

bash复制ccmake ..

在ccmake界面中,按'c'开始配置。这个过程会检查系统环境和依赖关系,可能需要几分钟。配置完成后,按'g'生成Makefile。

注意:如果配置过程中报错,通常是因为缺少某些依赖。仔细阅读错误信息,安装对应的开发包后重新配置。

生成Makefile后,就可以开始编译了:

bash复制make

这里有个重要提示:QGIS的编译不支持并行编译(make -j),必须使用单线程编译。虽然这会增加编译时间(通常需要3-5小时),但能避免很多奇怪的错误。

编译过程中可能会遇到各种警告,但只要不出现致命错误(fatal error)就可以继续。如果编译中断,需要先清理构建目录:

bash复制cd build-master
rm -rf *

然后重新从ccmake步骤开始。这点很重要,因为残留的中间文件可能导致后续编译失败。

5. 运行与验证

编译完成后,可以在output/bin目录下找到生成的可执行文件:

bash复制./output/bin/qgis

第一次启动可能会比较慢,这是正常现象。如果一切顺利,你应该能看到QGIS的启动界面。

为了确保所有功能都正常工作,我建议进行以下测试:

  1. 新建一个项目,添加各种图层(矢量、栅格)
  2. 尝试使用一些核心功能,如属性表查看、符号化设置
  3. 测试插件系统是否能正常工作
  4. 验证Python控制台是否能正常使用

如果遇到启动问题,可以尝试在终端中运行,这样能看到详细的错误输出。常见的问题包括:

  • 缺少运行时库:根据错误信息安装对应的库
  • Python模块问题:检查PYTHONPATH环境变量是否正确
  • 图形驱动问题:确保安装了正确的显卡驱动

6. 常见问题解决方案

在实际编译过程中,我遇到过不少问题,这里分享几个典型问题的解决方法:

问题1:编译过程中报错"Python.h not found"
这是因为Python开发头文件缺失。解决方法:

bash复制sudo apt-get install python3-dev

确保安装的python3-dev版本与你使用的Python版本一致。

问题2:Qt相关组件找不到
银河麒麟的Qt包命名可能与其他发行版不同,可以尝试:

bash复制sudo apt-get install qtbase5-dev qt5-default qttools5-dev-tools

问题3:GIS相关库链接失败
特别是GDAL、GEOS等库,需要确保开发包已安装:

bash复制sudo apt-get install libgdal-dev libgeos-dev

问题4:编译速度极慢
除了不能使用make -j外,可以尝试以下优化:

  1. 使用ccache加速后续编译:
bash复制sudo apt-get install ccache
export CCACHE_DIR="$HOME/.ccache"
export PATH="/usr/lib/ccache:$PATH"
  1. 确保系统有足够的内存和交换空间
  2. 关闭不必要的应用程序释放系统资源

问题5:运行时崩溃或界面异常
这可能是由于显卡驱动或OpenGL问题导致。尝试:

bash复制export QT_LOGGING_RULES="*.debug=false;qt.qpa.*=true"
./output/bin/qgis

查看日志输出定位问题根源。

7. 性能优化与后续维护

成功编译运行QGIS后,我们可以进一步优化使用体验:

创建桌面快捷方式
编辑~/.local/share/applications/qgis.desktop文件,添加以下内容:

ini复制[Desktop Entry]
Name=QGIS 3.26
Comment=Quantum GIS
Exec=/path/to/your/qgis/executable
Icon=/path/to/qgis/icon.png
Terminal=false
Type=Application
Categories=Education;Geoscience;
StartupNotify=true

设置环境变量
在~/.bashrc中添加:

bash复制export PATH=$PATH:${HOME}/dev/QGIS/QGIS-final-3_26_0/build-master/output/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HOME}/dev/QGIS/QGIS-final-3_26_0/build-master/output/lib

定期更新代码
如果需要更新到最新代码:

bash复制cd ${HOME}/dev/QGIS/QGIS-final-3_26_0
git pull
cd build-master
make clean
make

空间清理
编译完成后,可以清理中间文件节省空间:

bash复制cd build-master
make clean

这会保留必要的可执行文件和库,只删除中间对象文件。

经过这些步骤,你应该已经在银河麒麟V10上成功编译并运行了QGIS 3.26。这个过程虽然有些复杂,但能让你更深入地理解QGIS的构建系统和依赖关系。在实际项目中,这样的自定义编译还能让你根据需要启用或禁用特定功能,打造最适合自己工作流的QGIS版本。

内容推荐

EtherCAT轴控【实战避坑指南】
本文详细介绍了EtherCAT轴控系统的实战避坑指南,涵盖硬件连接、关键参数设置、电子齿轮比配置、运动控制编程及高级调试技巧。特别针对ECAT轴控中的常见问题提供解决方案,帮助工程师快速掌握调试要点,提升系统稳定性和控制精度。
Python实战:从DICOM文件中精准提取关键元数据
本文详细介绍了如何使用Python从DICOM文件中精准提取关键元数据,包括患者信息、影像采集参数和图像特性等。通过pydicom库的标签索引法和属性直接访问法,开发者可以高效处理医学影像数据,并应用于数据整理、质量控制和三维重建等场景。文章还提供了性能优化技巧和实际案例,帮助读者构建健壮的元数据提取流水线。
ESP-01s WiFi模块实战:从AT指令到NTP服务器精准授时
本文详细介绍了如何使用ESP-01s WiFi模块通过AT指令连接NTP服务器实现精准授时。从硬件连接到AT指令调试,再到NTP协议解析和时间转换,提供了完整的实战指南,帮助开发者快速实现物联网设备的时间同步功能,解决传统RTC模块的误差问题。
STM32实战指南:EXTI外部中断与NVIC优先级配置详解
本文详细解析了STM32中EXTI外部中断与NVIC优先级配置的核心概念与实战技巧。通过生动的比喻和代码示例,介绍了EXTI的配置步骤、NVIC优先级分组原则以及常见问题解决方案,帮助开发者快速掌握STM32中断系统的关键配置方法,提升嵌入式开发效率。
从SDF到体渲染:主流方法的核心转换逻辑与实现剖析
本文深入探讨了从SDF到体渲染的主流方法转换逻辑与实现技术,重点分析了MonoSDF、NeuS和VoxFusion等核心算法。通过比较不同SDF到密度转换方法的优劣,揭示了体渲染技术在三维重建中的关键作用,并提供了实用的损失函数设计和优化策略,为相关领域的研究与应用提供了重要参考。
用Python的scipy.stats对比两组数据差异?从癫痫EEG数据实战到你的AB测试,一份避坑指南
本文详细介绍了如何使用Python的scipy.stats进行独立样本T检验,从癫痫EEG数据分析到AB测试的实战应用。重点讲解了ttest_ind函数的核心假设、方差齐性检验(Levene检验)以及多重比较校正方法,帮助读者避免常见统计陷阱,提升数据分析的准确性。
HTTP 307临时重定向:保持请求方法不变的精准流量调度
本文深入解析HTTP 307临时重定向在精准流量调度中的核心价值,对比302重定向,307能保持原始请求方法不变,特别适用于POST/PUT等非幂等请求。通过电商大促、跨国SaaS服务等实战案例,展示307在蓝绿部署、跨区域路由等场景的应用优势,并详细讲解各技术框架的实现差异及高可用架构中的监控技巧。
在Station P2上玩转裸机开发:从WSL2配置到ARM64交叉编译环境搭建全记录
本文详细记录了在Station P2开发板上进行裸机开发的全过程,从WSL2环境配置到ARM64交叉编译工具链搭建,最终实现点亮LED的裸机程序。针对RK3568芯片特性,提供了实用的环境配置技巧和常见问题解决方案,帮助开发者快速上手ARM64架构的裸机开发。
别再傻傻分不清了!一文搞懂机器人关节里的‘三兄弟’:伺服电机、驱动器、控制器到底谁管谁?
本文深入解析机器人关节控制中的三大核心组件:伺服电机、驱动器和控制器的协同工作原理。伺服电机作为动力源实现精准运动,驱动器负责能量调度与信号转换,控制器则是运动规划的中枢。通过理解这三者的关系,工程师能有效解决工业机器人调试中的常见问题,提升系统性能与稳定性。
Qt 3D可视化实战:用C++代码将MATLAB的LCh颜色数据画成3D曲面图
本文详细介绍了如何利用Qt 3D实现MATLAB LCh颜色数据的3D可视化,涵盖从LCh到Lab再到XYZ的颜色空间转换原理及C++代码实现。通过Qt的Q3DSurface组件,开发者可以高效呈现科学计算中的颜色数据,并优化交互体验与渲染性能,适用于科学可视化、数据分析等领域。
告别Win32DiskImager:用dd命令在Ubuntu上给开发板烧录U-Boot的保姆级避坑指南
本文详细介绍了在Ubuntu系统下使用dd命令为开发板烧录U-Boot的完整指南,特别针对从Windows迁移的开发者。内容涵盖设备安全识别、dd命令参数解析、完整操作流程及验证方法,帮助开发者避免常见错误,提升烧录效率和安全性。
告别纯Client端:手把手教你用CANoe的NetWork Node搭建一个实时监控Server
本文详细介绍了如何利用CANoe的NetWork Node架构搭建实时监控服务器,实现从被动测试到主动监控的转变。通过核心场景分析、CAPL编程实现及硬件配置优化,帮助开发者构建具备实时决策能力的智能测试系统,显著提升汽车电子测试效率。
【flink番外篇】3、Flink物理分区策略深度解析:从Rebalance到Custom Partitioning的性能调优实战
本文深度解析Flink物理分区策略,从Rebalance到Custom Partitioning的性能调优实战。通过对比七种分区策略的适用场景和性能差异,结合电商实时大屏和风控系统等案例,详细讲解如何应对数据倾斜、选择分区键及优化并行度,帮助开发者提升Flink作业的吞吐量和稳定性。
十三、USB PD之Power Supply:从协议规范到工程实践的关键考量
本文深入探讨USB PD Power Supply从协议规范到工程实践的关键考量,涵盖电压切换、动态负载管理、保护机制及性能优化等核心问题。通过实际案例解析,如VBUS电压震荡、PPS电源调节等,揭示协议参数背后的工程意义,为电源设计提供实用指导。
实战分享:我们团队如何用洞态IAST+Jenkins把安全测试塞进CI/CD流水线
本文分享了如何通过洞态IAST与Jenkins的深度集成,将安全测试无缝嵌入CI/CD流水线,实现高效的应用安全检测。文章详细对比了SAST、DAST和IAST的优劣,提供了具体的Jenkins流水线集成步骤和性能优化建议,帮助团队在敏捷开发中兼顾安全与效率。
STM32量产烧录不求人:手把手教你用STVP命令行实现自动化固件下载
本文详细介绍了如何使用STVP命令行工具实现STM32芯片的量产自动化固件烧录。通过命令行参数解析、批处理脚本编写及Python控制框架,大幅提升烧录效率和准确性,适用于工业级生产线环境。文章还涵盖硬件连接方案、错误处理机制及高级加密技巧,帮助工程师快速部署稳定可靠的烧录系统。
C# 图像处理性能跃迁:从Bitmap.GetPixel到unsafe指针的实战演进
本文详细探讨了C#图像处理性能优化的三种技术方案:从低效的Bitmap.GetPixel到高效的BitmapData方案,再到终极性能武器unsafe指针操作。通过实战代码和性能对比,展示了如何实现从1200ms到30ms的40倍性能跃迁,特别适合需要实时图像处理的直播美颜、工业检测等场景。
MPU6050避坑指南:那些数据不准的常见原因与调试技巧
本文详细解析了MPU6050传感器数据不准的常见原因与调试技巧,涵盖上电初始化、寄存器配置、电源噪声干扰、I2C通信问题等关键点。通过实际案例和代码示例,帮助开发者快速解决MPU6050的常见问题,提升传感器数据精度和稳定性。
Flutter——从零到一构建自适应NavigationRail导航系统
本文详细介绍了如何使用Flutter的NavigationRail组件构建自适应导航系统,从基础框架搭建到高级定制技巧,涵盖响应式布局、性能优化及实战案例。通过智能响应不同设备屏幕尺寸,NavigationRail为现代应用提供了无缝导航体验,特别适合企业级仪表盘和电商后台系统。
【K8S】从请求到容器:Service、Kube-Proxy与Pod的流量寻址之旅
本文深入解析Kubernetes中Service、kube-proxy与Pod的流量寻址机制,通过生动类比揭示从请求到容器的完整路径。重点探讨Service的负载均衡原理、kube-proxy的iptables/ipvs模式演进,以及生产环境中的性能优化技巧,帮助开发者掌握K8S核心网络架构。
已经到底了哦
精选内容
热门内容
最新内容
告别Diesel?我为什么在Rust新项目里选择了Sea-ORM 0.9(附PostgreSQL实战对比)
本文探讨了在Rust新项目中从Diesel迁移到Sea-ORM 0.9的决策过程,详细对比了两者在异步支持、开发体验、PostgreSQL集成等方面的优劣。Sea-ORM凭借其零成本异步、符合直觉的API设计和智能代码生成等优势,显著提升了开发效率和可维护性,特别适合需要快速迭代和复杂数据关联的项目。
告别AD转战Allegro?我用Cadence 16.6 做高速板设计的真实体验与效率技巧分享
本文分享了从Altium Designer转向Cadence Allegro 16.6进行高速PCB设计的实战经验与效率技巧。通过详细解析Allegro的设计哲学、核心功能如Stroke命令定制、模块化布局和高速布线工具箱,帮助工程师快速适应这一专业工具,提升复杂电路板设计效率与可靠性。
DC-DC电源PCB布局实战:从环流分析到关键元件精准定位
本文深入探讨了DC-DC电源PCB布局的核心挑战与解决方案,重点分析了电流环路、输入电容布局、续流二极管布线及电感放置等关键设计要点。通过实战案例和量化数据,揭示了如何通过精准元件定位和优化布局降低噪声、提升效率,为工程师提供了一套完整的DC-DC电源设计避坑指南。
解锁Nature级数据呈现:双轴组合图在科研论文中的实战精解
本文详细解析了双轴组合图在科研论文中的应用,特别适合展示量纲不同的数据,如病例数与阳性率。通过R语言的ggplot2包,读者可以学习如何高效创建Nature级图表,包括数据准备、双坐标轴配置及美学优化技巧,提升论文的数据可视化水平。
MySQL插入数据前如何做检查?一个比WHERE子句更灵活的“条件插入”技巧
本文深入探讨MySQL中灵活的条件插入技巧,包括`INSERT IGNORE`、`REPLACE INTO`和子查询方案,帮助开发者在数据写入时实现智能控制。特别适合处理高并发下的唯一性检查和复杂业务逻辑,提升数据库操作的效率和安全性。
支持度、置信度、提升度到底怎么用?一个电商案例讲透关联规则的评估与陷阱
本文通过电商案例详细解析了关联规则分析中的支持度、置信度和提升度三大核心指标的应用与陷阱。结合实际业务场景,提供了动态阈值调整策略和典型规则类型的应对方案,帮助读者避免数据误判,提升营销效果。重点强调了提升度作为业务价值黄金指标的重要性,并分享了实战工作流与工具选择建议。
SAP PI/PO调用HTTPS接口踩坑记:手把手教你导入SSL证书解决iaik.security.ssl报错
本文详细解析了SAP PI/PO调用HTTPS接口时遇到的`iaik.security.ssl.SSLCertificateException`报错问题,提供了SSL证书导入的完整解决方案。通过密钥存储服务详解、证书导入步骤及问题排查技巧,帮助开发者有效解决SSL证书信任链验证问题,确保HTTPS接口调用的稳定性与安全性。
STM32U5低功耗模式实战:从睡眠到关机,唤醒后代码到底从哪跑?(附CubeMX配置)
本文深入解析STM32U5低功耗模式的唤醒机制与实战配置,涵盖从睡眠到关机四种模式的功耗特性及唤醒后代码执行路径。通过CubeMX配置技巧和调试方法,帮助开发者解决唤醒后的时钟重置、数据保持等关键问题,实现高效低功耗设计。特别针对STM32U5的低功耗模式优化提供了实用建议。
【Discuz】X3.5论坛模板目录深度解析与定制指南
本文深入解析Discuz X3.5论坛模板目录结构,提供从基础到高级的定制指南。涵盖公共模板、论坛功能模块、移动端适配等核心内容,分享实用修改技巧与安全建议,帮助开发者高效定制论坛界面,同时确保系统升级兼容性。
用例图实战指南:从零到一构建用户与系统的对话蓝图
本文详细介绍了用例图在软件设计中的核心作用与实战技巧,帮助开发者从零构建用户与系统的对话蓝图。通过解析参与者、用例和关系三大要素,结合五步绘制法和真实项目案例,指导读者精准定义系统功能需求,优化用户交互设计,提升需求分析的效率与准确性。