一、背景与适用场景
银河麒麟操作系统底层基于 Linux(类 Ubuntu/Debian),其软件源策略较为保守,官方仓库提供的 OpenCV、GDAL 等地理空间与计算机视觉库版本通常较旧,难以满足现代开发对新特性(如 OpenCV 4.x 的 DNN 模块、GDAL 3.x 的 MVT 支持)的需求。因此,从源码编译安装成为获取特定版本和完整功能的可靠路径。
本文以麒麟 V10(x86_64 架构、GCC 9.3.0、CMake 3.16.3)为例,完整记录 Qt、OpenCV、GDAL 三大组件的源码编译流程,并重点解析编译过程中高频出现的错误及其解决方案。
架构确认:编译前执行
arch确认系统架构(x86_64或aarch64),下载源码和依赖包时务必选择对应版本。
二、环境准备与依赖安装
在开始编译前,先安装基础开发工具和通用依赖:
bash
sudo apt update sudo apt install -y build-essential cmake pkg-config \ libjpeg-dev libpng-dev libtiff-dev \ libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ libgtk-3-dev libcanberra-gtk3-module \ libtbb2 libtbb-dev \ python3-dev python3-numpy
麒麟特别提醒:默认 GCC 版本可能偏旧。若编译时报 C++11/14 标准相关错误,可安装
gcc-7 g++-7并用update-alternatives切换。
三、Qt 安装
3.1 方式一:系统包管理器安装(最简)
适用于仅需基础 Qt5 开发库和 IDE 的场景:
bash
sudo apt install qtcreator qt5-default qtbase5-dev
安装后通过 qmake --version 验证。
3.2 方式二:官方安装包(推荐用于特定版本)
若需 Qt 5.12.8、6.9.3 等特定 LTS 版本或完整开发组件,从官网下载 .run 安装包:
bash
chmod +x qt-opensource-linux-x64-*.run sudo ./qt-opensource-linux-x64-*.run
关键步骤:
-
登录:可跳过(Skip)Qt 账户登录。
-
安装路径:建议改为
/opt/QtX.X.X,便于多用户管理。 -
组件选择:务必勾选与系统架构匹配的 Desktop gcc 64-bit 和 Qt Creator。
-
国内源加速:启动安装器时添加参数
--mirror http://mirrors.nju.edu.cn/qt/。
四、OpenCV 编译安装
4.1 下载源码
推荐使用 wget 下载源码快照,避免 git clone 在国内网络下的超时和子模块拉取失败问题:
bash
cd ~/桌面 wget -O opencv-4.12.0.tar.gz \ https://github.com/opencv/opencv/archive/4.12.0.tar.gz # 可选:下载 contrib 扩展模块(版本号必须一致) wget -O opencv_contrib-4.12.0.tar.gz \ https://github.com/opencv/opencv_contrib/archive/4.12.0.tar.gz
关键提醒:GitHub 下载务必选择 "Source code" (tar.gz),而非 Windows/Android 预编译包。
4.2 解压与构建目录准备
bash
tar -xzf opencv-4.12.0.tar.gz tar -xzf opencv_contrib-4.12.0.tar.gz # 如需要 contrib cd opencv-4.12.0 mkdir -p build && cd build
4.3 CMake 配置
不含 contrib 的基础配置:
bash
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_GTK=ON \
-D WITH_V4L=ON \
-D WITH_FFMPEG=ON \
-D BUILD_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
-D OPENCV_GENERATE_PKGCONFIG=ON \
..
含 contrib 的配置(在末尾追加):
bash
-D OPENCV_EXTRA_MODULES_PATH=~/桌面/opencv_contrib-4.12.0/modules \
..
配置成功的标志:
text
-- Configuring done -- Generating done -- Build files have been written to: /home/llh/桌面/opencv-4.12.0/build
4.4 常见配置错误及解决方案
错误 1:缺少 .. 导致找不到 CMakeLists.txt
text
CMake Error: The source directory ".../build" does not appear to contain CMakeLists.txt.
原因:CMake 命令末尾缺少 ..,导致其误以为源码目录就是 build 文件夹。
解决:在命令末尾补上 ..。
错误 2:contrib 模块路径不存在
text
CMake Error at cmake/OpenCVModule.cmake:274 (message): No modules has been found: .../opencv_contrib-4.12.0/modules
原因:-D OPENCV_EXTRA_MODULES_PATH 指向的目录不存在(contrib 未成功下载),或 build 目录残留了上一次的 CMakeCache.txt,即使命令行未带该参数也会从缓存读取。
解决:
-
确认目录存在:
ls ~/桌面/opencv_contrib-4.12.0/modules -
若不需要 contrib,彻底清空缓存后重配:
bash
cd ~/桌面/opencv-4.12.0 rm -rf build mkdir build && cd build # 执行不带 contrib 的 cmake 命令
-
验证缓存:
grep -i contrib build/CMakeCache.txt
错误 3:ADE 下载失败导致配置中断
text
CMake Warning at cmake/OpenCVDownload.cmake:251 (message): ADE: Download failed: 35;"SSL connect error"
原因:gapi 模块依赖 ADE 库,从 GitHub 下载时因 SSL/网络问题失败。
解决:禁用 gapi 模块,绕开 ADE 下载:
bash
cmake ... -D BUILD_opencv_gapi=OFF ..
错误 4:IPPICV 下载失败(可忽略)
text
IPPICV: Download failed: 35;"SSL connect error"
说明:Intel 性能库,下载失败 OpenCV 会自动跳过,仅性能略低,不影响编译。
4.5 编译与安装
bash
# 虚拟机建议先用 -j2,避免内存不足被 OOM kill make -j2 sudo make install sudo ldconfig
编译验证:
bash
pkg-config --modversion opencv4 # 应输出 4.12.0
安装后头文件位于 /usr/local/include/opencv4,库文件位于 /usr/local/lib。
4.6 Qt 项目集成
在 Qt 项目的 .pro 文件中添加:
pro
INCLUDEPATH += /usr/local/include/opencv4
LIBS += -L/usr/local/lib \
-lopencv_core \
-lopencv_imgproc \
-lopencv_imgcodecs \
-lopencv_highgui
测试代码(main.cpp):
cpp
#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << "OpenCV version:" << CV_VERSION;
cv::Mat img = cv::imread("test.jpg");
if (img.empty()) {
qDebug() << "图片读取失败";
} else {
qDebug() << "图片读取成功,尺寸:" << img.cols << "x" << img.rows;
}
MainWindow w;
w.show();
return a.exec();
}
若报 undefined reference to cv::imread,检查 .pro 中是否正确链接了 opencv_imgcodecs。
五、GDAL 编译安装
GDAL 的编译依赖关系特殊,需按 SQLite → PROJ → GDAL 的顺序编译安装。
5.1 编译 SQLite(开启关键特性)
GDAL 处理 GeoPackage、Spatialite 等格式时,需要 SQLite 启用 COLUMN_METADATA 支持,系统自带版本通常未开启。
下载源码(autoconf 版本):
bash
cd /data/inst wget https://www.sqlite.org/2023/sqlite-autoconf-3440000.tar.gz tar -zxvf sqlite-autoconf-3440000.tar.gz cd sqlite-autoconf-3440000
配置编译:
bash
./configure --prefix=/usr/local/sqlite3 \ CFLAGS='-g -O2 -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_RTREE' make -j$(nproc) sudo make install
权限修复(若普通用户报"权限不够"):
bash
sudo chmod +x /usr/local/sqlite3/bin/sqlite3
配置环境变量:
bash
echo 'export PATH=/usr/local/sqlite3/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
5.2 编译 PROJ(坐标转换基石)
PROJ 是 GDAL 处理坐标系统的核心依赖,版本必须 >= 6.3。
下载源码:
bash
cd /data/inst wget https://download.osgeo.org/proj/proj-6.3.1.tar.gz tar -zxvf proj-6.3.1.tar.gz cd proj-6.3.1
方案 A:CMake 构建(推荐)
PROJ 官方从版本 7 起推荐 CMake,对非标准路径依赖处理更可靠:
bash
mkdir build && cd build cmake .. \ -DCMAKE_INSTALL_PREFIX=/usr/local/proj6 \ -DCMAKE_BUILD_TYPE=Release \ -DSQLITE3_INCLUDE_DIR=/usr/local/sqlite3/include \ -DSQLITE3_LIBRARY=/usr/local/sqlite3/lib/libsqlite3.so make -j$(nproc) sudo make install
方案 B:Autotools 构建
bash
export PATH=/usr/local/sqlite3/bin:$PATH export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=/usr/local/sqlite3/lib/pkgconfig:$PKG_CONFIG_PATH ./configure --prefix=/usr/local/proj6 --enable-threads make -j1 sudo make install
常见错误:cannot find iso19111/: file format not recognized
原因:autotools 生成的 Makefile 在非标准 SQLite 路径下变量展开错误,链接器试图将目录 iso19111/ 当作文件链接。
解决:
-
确认 SQLite 版本 >= 3.11 且已被正确识别:
bash
grep -i sqlite /tmp/proj_conf.log # 应输出 checking for sqlite3... yes
-
若 autotools 反复失败,改用 CMake 构建(方案 A),显式指定
SQLITE3_INCLUDE_DIR和SQLITE3_LIBRARY,可从根本上避开此问题。
验证安装:
bash
ls /usr/local/proj6/lib/libproj* # 应看到 libproj.so、libproj.so.15 等文件
配置环境变量:
bash
echo 'export PROJ_ROOT=/usr/local/proj6' >> ~/.bashrc echo 'export PATH=$PROJ_ROOT/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=$PROJ_ROOT/lib:$LD_LIBRARY_PATH' >> ~/.bashrc echo 'export PROJ_DATA=$PROJ_ROOT/share/proj' >> ~/.bashrc source ~/.bashrc
5.3 编译 GDAL
下载源码:
bash
cd /data/inst wget https://github.com/OSGeo/gdal/releases/download/v3.6.4/gdal-3.6.4.tar.gz tar -zxvf gdal-3.6.4.tar.gz cd gdal-3.6.4
配置(关键步骤):
bash
./configure --prefix=/usr/local/gdal \
--with-proj=/usr/local/proj6 \
--with-sqlite3=/usr/local/sqlite3 \
--without-java
参数解析:
-
--prefix=/usr/local/gdal:独立安装目录,避免污染系统。 -
--with-proj=/usr/local/proj6:核心参数,强制指向自定义 PROJ,解决 "PROJ 6 symbols not found"。 -
--with-sqlite3=/usr/local/sqlite3:显式指定 SQLite 路径。 -
--without-java:跳过 Java 绑定检查,避免不必要的报错。
检查配置输出:留意 checking for PROJ 和 checking for sqlite3 的结果应为 yes。
编译安装:
bash
make -j2 sudo make install
配置环境变量:
bash
echo 'export PATH=/usr/local/gdal/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/gdal/lib:$LD_LIBRARY_PATH' >> ~/.bashrc echo 'export GDAL_DATA=/usr/local/gdal/share/gdal' >> ~/.bashrc source ~/.bashrc sudo ldconfig
验证:
bash
gdalinfo --version # 应输出 GDAL 3.6.4, released ...
六、避坑总结
| 问题 | 根本原因 | 解决方案 |
|---|---|---|
| OpenCV 配置报 "No modules has been found" | build 目录残留 CMakeCache.txt,或 contrib 未下载 | 清空 build 目录重配,或去掉 contrib 参数 |
| OpenCV 配置报 ADE 下载失败 | gapi 模块依赖 ADE,网络受限 | 加 -D BUILD_opencv_gapi=OFF |
PROJ 编译报 iso19111/ 链接错误 | autotools 对非标准 SQLite 路径处理错误 | 改用 CMake 构建,显式指定 SQLITE3 路径 |
| SQLite 报"权限不够" | 安装时属主为 root,缺执行位 | sudo chmod +x 修复 |
| GDAL 找不到 PROJ | 未显式指定路径,找到系统旧版本 | --with-proj=/usr/local/proj6 |
| 编译中途被 Killed | 虚拟机内存不足 | 降为 make -j1 或 -j2 |
| 运行时找不到库 | 未刷新动态链接库缓存 | sudo ldconfig 并配置 LD_LIBRARY_PATH |
核心原则
-
环境隔离:将自定义编译的库安装在
/usr/local/下的独立目录,避免污染系统自带软件,便于后续升级或卸载。 -
显式路径:编译 GDAL 等上层库时,务必通过参数显式指定下层依赖的路径,防止链接到系统旧版本。
-
环境变量:编译完成后,正确配置
PATH、LD_LIBRARY_PATH、PKG_CONFIG_PATH及/etc/ld.so.conf.d/,确保系统能找到新库。 -
构建工具选择:遇到 autotools 兼容性问题时,优先考虑改用 CMake 构建,其依赖路径处理更可靠。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/llhllq2015/article/details/166994291




