【龙芯平台实战】久久派OpenCV交叉编译:从源码到嵌入式视觉应用部署
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 &
- Where is the source code: 点击
Browse Source...,选择刚才解压的opencv-4.10.0目录。 - Where to build the binaries: 点击
Browse Build...,就选择当前的build目录。 - 点击左下角的
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会开始第一次配置,并出现大量红色的配置项。别慌,这是正常的。接下来我们逐一修改关键项:
CMAKE_BUILD_TYPE: 设置为Release,优化性能,减小体积。CMAKE_INSTALL_PREFIX: 非常重要! 这是最终编译产物的安装路径。点击...,浏览并选择我们之前创建的~/loongson_ws/opencv/install目录。这样make install后,所有给久久派用的头文件和库都会整齐地放在这里。CMAKE_EXE_LINKER_FLAGS和CMAKE_SHARED_LINKER_FLAGS: 在原有内容末尾(可能是空的)添加-lpthread -lrt -ldl。这是为了解决后续链接阶段可能出现的pthread等库未找到的错误。WITH_GTK和WITH_GTK_2_X: 由于久久派是嵌入式环境,通常没有GTK图形界面,建议取消勾选,减少依赖。BUILD_TESTS和BUILD_PERF_TESTS: 务必取消勾选。这些是主机上的测试程序,交叉编译它们几乎一定会失败,而且没必要。BUILD_opencv_world: 这是一个有趣的选项。如果勾选,它会将几乎所有OpenCV模块打包成一个巨大的libopencv_world.so库,部署时只需要拷贝一个库文件,非常方便。但缺点是库文件很大。对于久久派,如果存储空间紧张,建议不勾选,让CMake生成多个独立的.so库,你可以按需选择拷贝。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登录到你的久久派系统。
-
解压库文件:
cd /home/root tar -zxvf opencv_loongarch64_lib.tar.gz这会解压出一个
lib文件夹。 -
配置系统库加载路径: 我们需要告诉系统去哪里找我们新装的OpenCV库。
# 创建一个新的配置文件 sudo vi /etc/ld.so.conf.d/opencv.conf在文件中写入一行,即你解压的
lib文件夹的绝对路径:/home/root/lib保存退出。
-
更新动态链接库缓存:
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版本号和一个单位矩阵,那么恭喜你,整个从交叉编译到部署的流程已经完美走通!你的久久派现在已经具备了强大的计算机视觉能力,可以开始着手开发图像处理、目标检测等各种有趣的应用了。这个过程虽然步骤不少,但每一步都有其明确的目的,踩过一次坑之后,以后再为其他龙芯平台编译软件,思路就会清晰很多。
更多推荐

所有评论(0)