1. 为什么要在久久派上折腾OpenCV?

如果你手头有一块龙芯的久久派开发板,又恰好想在上面跑点图像识别、人脸检测或者简单的视觉处理程序,那你大概率绕不开一个核心任务:给久久派交叉编译OpenCV。我刚开始接触这块板子的时候,也觉得这事儿挺麻烦的。一个在x86电脑上apt install就能搞定的事情,到了龙芯的LoongArch架构上,怎么就变成了一场“硬仗”?

但真做下来,你会发现这其实是个“纸老虎”。整个过程就像搭积木,步骤是固定的,坑也是明摆着的,只要你按顺序来,避开那几个常见的雷区,成功是必然的。这篇文章,我就把我自己从零开始,在久久派上成功部署OpenCV 4.10.0的全过程,掰开了揉碎了讲给你听。我会重点分享那些官方教程里可能不会细说,但实际编译时一定会卡住你的细节,比如依赖库的玄学问题、CMake配置的关键选项,还有最后部署到板子上时那个经典的“symbolic link”错误。

我的目标很简单:让你看完就能动手,一次编译成功,快速在久久派上跑起你自己的视觉程序。我们不需要深究太多复杂的交叉编译原理,就聚焦于实战操作。你需要准备的就是一台x86_64的Linux主机(Ubuntu 20.04/22.04都行),一块久久派板子,一根串口线或者网络连接,再加上一点耐心。接下来,咱们就从最基础的环境搭建开始。

2. 搭建编译主机:稳扎稳打的第一步

工欲善其事,必先利其器。交叉编译的主战场是你的x86电脑,这里环境稳了,后面才能顺。我强烈建议使用一个干净的Ubuntu系统(物理机或虚拟机均可),避免之前安装的各种杂七杂八的库带来冲突。

2.1 安装必备的编译工具链

首先,更新系统并安装最核心的构建工具。打开终端,执行以下命令:

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential cmake cmake-qt-gui cmake-curses-gui git pkg-config

这里build-essential提供了gcc、g++、make等基础编译工具;cmake是OpenCV构建系统的核心,而cmake-qt-gui和cmake-curses-gui则提供了图形化和终端下的配置界面,后面我们会用到cmake-gui来可视化配置,这对新手特别友好。

2.2 搞定那些让人头疼的依赖库

OpenCV功能强大,依赖的第三方库也多。虽然有些在交叉编译时并非必需,但预先装好可以避免很多诡异的编译错误。我根据多次实战经验,整理了一份“高成功率”依赖列表:

sudo apt install -y libopenblas-dev libatlas-base-dev gfortran
sudo apt install -y libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install -y libtbb-dev libgtk-3-dev liblapacke-dev
sudo apt install -y python3-dev python3-numpy

重点解释几个容易出问题的:

  • libopenblas-dev / libatlas-base-dev: 这是矩阵运算的加速库。OpenCV的很多核心算法(比如DNN模块)依赖它。即使交叉编译,配置阶段也会检查,预先安装能让CMake更顺利地找到参考路径。
  • libdc1394-22-dev: 这是FireWire相机驱动库。听起来和嵌入式没关系?但如果不装,编译时可能会报找不到特定头文件的错误,直接装上最省心。
  • python3-dev 和 python3-numpy: 即使你不在久久派上用Python绑定,在主机上配置时,CMake也可能因为找不到Python而报警告或影响其他模块。装上它们能让配置过程更干净。

一个重要的心态调整: 你现在在主机上安装的这些-dev包,并不是要把它们整个拷贝到久久派上。它们的作用是提供头文件(.h)和库文件(.so或.a),供编译阶段使用。最终打包给久久派的,是我们后续交叉编译出来的、针对龙芯架构的新库。所以不用担心污染目标板,这是标准流程。

3. 获取源码与交叉编译工具链

3.1 下载OpenCV源码

我选用的是OpenCV 4.10.0,这是一个比较稳定且功能齐全的版本。你可以直接从OpenCV官网的GitHub Release页面下载源码压缩包,或者用git克隆。为了稳定和可复现,我推荐下载压缩包。

# 在主目录下创建一个工作空间
mkdir -p ~/loongson_ws/opencv
cd ~/loongson_ws/opencv
# 使用wget下载(请替换为最新的下载链接,或使用我提供的备份链接)
wget -O opencv-4.10.0.tar.gz https://github.com/opencv/opencv/archive/refs/tags/4.10.0.tar.gz
# 解压
tar -zxvf opencv-4.10.0.tar.gz

如果网络不畅,也可以使用国内镜像或网盘资源,确保源码完整性即可。

3.2 获取龙芯交叉编译工具链

这是最关键的一步。你需要龙芯官方提供的、针对久久派(通常是ls2k1000或ls3a5000架构)的交叉编译工具链。这个工具链里包含了针对龙芯架构的gcc、g++、ld等工具。

  • 来源:通常从龙芯开源社区或购买久久派时提供的资料包中获取。它可能是一个名为loongarch64-linux-gnu-cross.tgz或类似格式的压缩包。
  • 安装:假设你下载的工具链包是loongarch64-linux-gnu-gcc.tar.xz。
# 通常将其解压到/opt目录下
sudo tar -xJf loongarch64-linux-gnu-gcc.tar.xz -C /opt

解压后,在/opt目录下会有一个类似loongarch64-linux-gnu的文件夹。你需要将工具链的bin目录添加到系统的PATH环境变量中,这样我们才能在任何地方使用loongarch64-linux-gnu-gcc这样的命令。

# 编辑你的shell配置文件,比如 ~/.bashrc
echo 'export PATH=/opt/loongarch64-linux-gnu/bin:$PATH' >> ~/.bashrc
# 立即生效
source ~/.bashrc

验证工具链是否安装成功:

loongarch64-linux-gnu-gcc --version

如果成功输出gcc版本信息,且目标显示为loongarch64-linux-gnu,那么恭喜你,最难找的资源已经到位了。

4. 配置与编译:CMake的核心魔法

一切准备就绪,现在进入核心的配置编译阶段。我们将使用cmake-gui进行可视化配置,这比手写CMake命令更直观,尤其适合处理复杂的交叉编译参数。

4.1 创建构建目录并启动CMake GUI

cd ~/loongson_ws/opencv
# 在opencv-4.10.0同级目录创建build和install目录
mkdir build install
cd build
# 启动cmake图形化配置界面
cmake-gui ../opencv-4.10.0 &
  1. Where is the source code: 点击Browse Source...,选择刚才解压的opencv-4.10.0目录。
  2. Where to build the binaries: 点击Browse Build...,就选择当前的build目录。
  3. 点击左下角的 Configure 按钮。

4.2 关键配置项详解(照着填,别出错)

在弹出的配置对话框中,选择 Specify options for cross-compiling,然后点击Next。

  • Target System: 选择 Linux
  • Processor: 填写 loongarch64
  • C Compiler: 点击右侧的...,浏览找到 /opt/loongarch64-linux-gnu/bin/loongarch64-linux-gnu-gcc
  • C++ Compiler: 同样找到 /opt/loongarch64-linux-gnu/bin/loongarch64-linux-gnu-g++
  • Target Root: 留空或填写你的工具链根目录 /opt/loongarch64-linux-gnu。然后点击Finish。

CMake会开始第一次配置,并出现大量红色的配置项。别慌,这是正常的。接下来我们逐一修改关键项:

  1. CMAKE_BUILD_TYPE: 设置为 Release,优化性能,减小体积。
  2. CMAKE_INSTALL_PREFIX: 非常重要! 这是最终编译产物的安装路径。点击...,浏览并选择我们之前创建的 ~/loongson_ws/opencv/install 目录。这样make install后,所有给久久派用的头文件和库都会整齐地放在这里。
  3. CMAKE_EXE_LINKER_FLAGS 和 CMAKE_SHARED_LINKER_FLAGS: 在原有内容末尾(可能是空的)添加 -lpthread -lrt -ldl。这是为了解决后续链接阶段可能出现的pthread等库未找到的错误。
  4. WITH_GTK 和 WITH_GTK_2_X: 由于久久派是嵌入式环境,通常没有GTK图形界面,建议取消勾选,减少依赖。
  5. BUILD_TESTS 和 BUILD_PERF_TESTS: 务必取消勾选。这些是主机上的测试程序,交叉编译它们几乎一定会失败,而且没必要。
  6. BUILD_opencv_world: 这是一个有趣的选项。如果勾选,它会将几乎所有OpenCV模块打包成一个巨大的libopencv_world.so库,部署时只需要拷贝一个库文件,非常方便。但缺点是库文件很大。对于久久派,如果存储空间紧张,建议不勾选,让CMake生成多个独立的.so库,你可以按需选择拷贝。
  7. ENABLE_PRECOMPILED_HEADERS: 可以取消勾选,有时能避免一些编译错误。

搜索并检查以下关键路径是否正确指向了你的交叉工具链:

  • PKG_CONFIG_EXECUTABLE: 应指向工具链中的pkg-config,如/opt/loongarch64-linux-gnu/bin/loongarch64-linux-gnu-pkg-config。如果找不到,可以暂时留空或指向主机系统的,影响不大。
  • 确保所有*_INCLUDE_PATH和*_LIBRARY相关的路径,没有错误地指向了主机x86的库。CMake在交叉编译模式下通常会处理好,但检查一下更安心。

4.3 一个必须手动修复的源码补丁

在点击Generate生成Makefile之前,还有一个必坑步骤。OpenCV 4.10.0的某个第三方组件(protobuf)在交叉编译时会有pthread相关定义问题。我们需要手动给源码打一个小补丁。

保持CMake-GUI开着,另开一个终端:

cd ~/loongson_ws/opencv
vi opencv-4.10.0/3rdparty/protobuf/src/google/protobuf/stubs/common.cc

(或者用你喜欢的编辑器,如nano或gedit) 在文件的开头,#include语句的后面,添加一行宏定义:

#define HAVE_PTHREAD

保存并退出。这个操作确保了在编译protobuf时能正确定义线程相关函数。

4.4 生成与编译

回到CMake-GUI,点击 Generate 按钮。如果下方输出Generating done,且没有红色错误提示,说明Makefile已成功生成。现在可以关闭CMake-GUI了。

在终端build目录下,开始漫长的编译:

# 使用多核编译加快速度,j后面的数字是你的CPU核心数(如4,8,16)
make -j8

这个过程可能会持续十几分钟到半小时,取决于你的电脑性能。如果遇到错误,通常是某个依赖没找到。请根据错误信息,回头检查第2步中对应的-dev包是否已安装,或者CMake配置中路径是否有误。

编译成功后,执行安装:

sudo make install

这里使用sudo是因为要向CMAKE_INSTALL_PREFIX指定的目录写入文件。完成后,去~/loongson_ws/opencv/install目录看看,应该已经有了include、lib、bin等文件夹。lib文件夹里就是我们千辛万苦编译出来的、给龙芯久久派使用的OpenCV库文件(.so或.a)。

5. 部署到久久派:临门一脚的细节

编译成功只算完成了一半,把库正确部署到板子上并让它跑起来,同样关键。

5.1 打包与传输

首先,将编译好的库文件打包。我们主要需要lib目录下的动态库(.so文件)。

cd ~/loongson_ws/opencv/install
tar -zcvf opencv_loongarch64_lib.tar.gz lib/

现在,你需要把这个opencv_loongarch64_lib.tar.gz文件拷贝到久久派上。可以通过U盘、SCP命令或者网络共享文件夹。这里以SCP为例(假设久久派IP是192.168.1.100):

scp opencv_loongarch64_lib.tar.gz root@192.168.1.100:/home/root/

5.2 在久久派上解压与配置

通过串口或SSH登录到你的久久派系统。

  1. 解压库文件:

    cd /home/root
    tar -zxvf opencv_loongarch64_lib.tar.gz
    

    这会解压出一个lib文件夹。

  2. 配置系统库加载路径: 我们需要告诉系统去哪里找我们新装的OpenCV库。

    # 创建一个新的配置文件
    sudo vi /etc/ld.so.conf.d/opencv.conf
    

    在文件中写入一行,即你解压的lib文件夹的绝对路径:

    /home/root/lib
    

    保存退出。

  3. 更新动态链接库缓存:

    sudo ldconfig
    

5.3 解决经典的“symbolic link”错误

这里是最容易翻车的地方! 如果你在执行sudo ldconfig后,看到类似这样的警告:

ldconfig: /home/root/lib/libopencv_core.so.4.10.0 is not a symbolic link

这说明你的库文件缺少了版本号软链接。在Linux中,一个库通常有三个名字(以libopencv_core为例):

  • libopencv_core.so.4.10.0 - 真实库文件,带完整版本号
  • libopencv_core.so.410 - 主版本号链接(指向上面那个)
  • libopencv_core.so - 通用链接(指向上面那个)

交叉编译生成的库可能只包含了第一个。你需要手动创建这些软链接。

解决方案: 进入库目录,批量创建链接(请务必在久久派上操作,不要在Windows解压后再传,会破坏文件属性):

cd /home/root/lib
for file in libopencv_*.so.4.10.0; do
    base=${file%.so.4.10.0}  # 去掉后缀
    ln -sf $file ${base}.so.410  # 创建主版本链接
    ln -sf ${base}.so.410 ${base}.so  # 创建通用链接
done

执行完后再运行sudo ldconfig,应该就没有警告了。

5.4 验证部署是否成功

在久久派上写一个最简单的C++测试程序test_opencv.cpp:

#include <opencv2/core.hpp>
#include <iostream>

int main() {
    std::cout << "OpenCV version on LoongArch: " << CV_VERSION << std::endl;
    cv::Mat testMat = cv::Mat::eye(3, 3, CV_32F);
    std::cout << "Test matrix:\n" << testMat << std::endl;
    std::cout << "OpenCV works!" << std::endl;
    return 0;
}

使用交叉工具链编译它(注意:这是在你的x86主机上操作):

cd ~/loongson_ws/opencv
# 使用交叉编译器编译测试程序
loongarch64-linux-gnu-g++ -o test_opencv test_opencv.cpp \
-I ./install/include/opencv4 \
-L ./install/lib \
-lopencv_core -lopencv_imgcodecs -ldl -lpthread -lrt

将编译生成的可执行文件test_opencv拷贝到久久派,并运行:

# 在久久派上
./test_opencv

如果成功输出OpenCV版本号和一个单位矩阵,那么恭喜你,整个从交叉编译到部署的流程已经完美走通!你的久久派现在已经具备了强大的计算机视觉能力,可以开始着手开发图像处理、目标检测等各种有趣的应用了。这个过程虽然步骤不少,但每一步都有其明确的目的,踩过一次坑之后,以后再为其他龙芯平台编译软件,思路就会清晰很多。

更多推荐