我喜欢就喜欢头像
关注
麒麟系统 Qt + OpenCV + GDAL 源码编译安装封面图

麒麟系统 Qt + OpenCV + GDAL 源码编译安装

一、背景与适用场景

银河麒麟操作系统底层基于 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,即使命令行未带该参数也会从缓存读取。

解决:

  1. 确认目录存在:ls ~/桌面/opencv_contrib-4.12.0/modules

  2. 若不需要 contrib,彻底清空缓存后重配:

bash

cd ~/桌面/opencv-4.12.0
rm -rf build
mkdir build && cd build
# 执行不带 contrib 的 cmake 命令
  1. 验证缓存: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/ 当作文件链接。

解决:

  1. 确认 SQLite 版本 >= 3.11 且已被正确识别:

bash

grep -i sqlite /tmp/proj_conf.log
# 应输出 checking for sqlite3... yes
  1. 若 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

核心原则

  1. 环境隔离:将自定义编译的库安装在 /usr/local/ 下的独立目录,避免污染系统自带软件,便于后续升级或卸载。

  2. 显式路径:编译 GDAL 等上层库时,务必通过参数显式指定下层依赖的路径,防止链接到系统旧版本。

  3. 环境变量:编译完成后,正确配置 PATH、LD_LIBRARY_PATH、PKG_CONFIG_PATH 及 /etc/ld.so.conf.d/,确保系统能找到新库。

  4. 构建工具选择:遇到 autotools 兼容性问题时,优先考虑改用 CMake 构建,其依赖路径处理更可靠。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/llhllq2015/article/details/166994291

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--