【Rust交叉编译】在x86_64架构下交叉编译aarch64-linux-musl版的rust-opencv

目标

在x86_64架构的Ubuntu系统上,纯静态编译aarch64平台的rust-opencv,以方便在嵌入式设备上移植。

基础环境

系统:Ubuntu 24.04,架构:x86_64,可使用WSL,或者Docker,本次使用Docker。

shell 复制代码
#拉取基础镜像
docker pull ubuntu:24.04

#启动Docker容器
docker run -it --name rust-aarch64 -v .:/build ubuntu:24.04

安装git

shell 复制代码
apt update
apt install git

安装基础工具

shell 复制代码
apt install build-essential wget curl llvm libclang-dev

安装并编译交叉编译工具

shell 复制代码
# 新建个目录存放编交叉编译相关工具
mkdir -p /tools
cd /tools

# 下载交叉编译工具
git clone https://github.com/richfelker/musl-cross-make.git
cd musl-cross-make

# 写入编译配置
cat > config.mak <<EOF
TARGET = aarch64-linux-musl
OUTPUT = /opt/musl-cross
GCC_VER = 11.5.0
#COMMON_CONFIG += CC="aarch64-linux-musl-gcc -static --static" CXX="aarch64-linux-musl-g++ -static --static"
GCC_CONFIG += --enable-languages=c,c++
BINUTILS_VER = 2.33.1
MUSL_VER = 1.2.5
GCC_CONFIG += --enable-static --enable-libstdcxx-static --enable-threads=posix
EOF

# 编译
make -j$(nproc)
# 安装,将会被安装在/opt/musl-cross目录下
make install

# 配置环境变量
export PATH=/opt/musl-cross/bin:$PATH

编译OpenCV

shell 复制代码
# 拉取OpenCV源码
cd /tools
git clone https://github.com/opencv/opencv.git


#拉取opencv_contrib源码
git clone https://github.com/opencv/opencv_contrib.git

cd /tools/opencv && mkdir build && cd build

# 编译
cmake  .. \
-D CMAKE_SYSTEM_NAME=Linux \
-D CMAKE_SYSTEM_PROCESSOR=aarch64 \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_C_COMPILER=aarch64-linux-musl-gcc \
-D CMAKE_CXX_COMPILER=aarch64-linux-musl-g++ \
-D BUILD_SHARED_LIBS=OFF \
-D CMAKE_CXX_FLAGS=-fPIC \
-D CMAKE_C_FLAGS=-fPIC  \
-D CMAKE_EXE_LINKER_FLAGS="-lpthread -ldl"  \
-D ENABLE_PIC=OFF  \
-D WITH_1394=OFF \
-D WITH_ARAVIS=OFF \
-D WITH_ARITH_DEC=ON  \
-D WITH_ARITH_ENC=ON  \
-D WITH_CLP=OFF  \
-D WITH_CUBLAS=OFF \
-D WITH_CUDA=OFF  \
-D WITH_CUFFT=OFF \
-D WITH_FFMPEG=OFF  \
-D WITH_GSTREAMER=ON \
-D WITH_GSTREAMER_0_10=OFF  \
-D WITH_HALIDE=OFF  \
-D WITH_HPX=OFF \
-D WITH_IMGCODEC_HDR=ON \
-D WITH_IMGCODEC_PXM=ON \
-D WITH_IMGCODEC_SUNRASTER=ON \
-D WITH_INF_ENGINE=OFF \
-D WITH_IPP=OFF  \
-D WITH_ITT=OFF \
-D WITH_JASPER=ON \
-D WITH_JPEG=ON  \
-D WITH_LAPACK=ON  \
-D WITH_LIBREALSENSE=OFF  \
-D WITH_NVCUVID=OFF  \
-D WITH_OPENCL=OFF  \
-D WITH_OPENCLAMDBLAS=OFF \
-D WITH_OPENCLAMDFFT=OFF  \
-D WITH_OPENCL_SVM=OFF  \
-D WITH_OPENEXR=OFF  \
-D WITH_OPENGL=OFF \
-D WITH_OPENMP=OFF \
-D WITH_OPENNNI=OFF  \
-D WITH_OPENNNI2=OFF \
-D WITH_OPENVX=OFF  \
-D WITH_PNG=ON \
-D WITH_PROTOBUF=ON \
-D WITH_PTHREADS_PF=ON \
-D WITH_PVAPI=OFF  \
-D WITH_QT=OFF -D WITH_QUIRC=OFF \
-D WITH_TBB=OFF \
-D WITH_TIFF=ON \
-D WITH_VULKAN=OFF  \
-D WITH_WEBP=ON \
-D WITH_XIMEA=OFF  \
-D BUILD_JAVA=OFF \
-D BUILD_opencv_python3=OFF \
-D CMAKE_INSTALL_PREFIX=/opt/opencv \
-D WITH_GTK=OFF  \
-D WITH_EIGEN=OFF \
-D OPENCV_EXTRA_MODULES_PATH="/tools/opencv_contrib/modules" \
-D BUILD_ZLIB=ON  \
-D ZLIB_INCLUDE_DIR="../3rdparty/zlib" \
-D OPENCV_GENERATE_PKGCONFIG=ON \

make -j$(nproc)

#安装,将会被安装到/opt/opencv
make install

安装Rust

shell 复制代码
# 安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "$HOME/.cargo/env"

#添加aarch64-unknown-linux-musl工具链
rustup target add aarch64-unknown-linux-musl

创建一个简单的Rust项目

shell 复制代码
# Cargo.toml
[package]
name = "opencv-cross-demo"
version = "0.1.0"
edition = "2024"

[dependencies]
opencv = "0.94.2"
rust 复制代码
// main.rs
use opencv::imgcodecs::{IMREAD_COLOR, imread};
use opencv::prelude::MatTraitConst;

fn main() -> Result<(), Box<dyn std::error::Error>> {
	// 在项目根目录下添加一张图片
    let image = imread("image.jpg", IMREAD_COLOR)?;
    println!("image size: {} x {}", image.cols(), image.rows());

    Ok(())
}
shell 复制代码
# config.toml
[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-ld"
rustflags = [
    "-L", "/opt/opencv/install/lib",
    "-L", "/opt/opencv/install/lib/opencv4/3rdparty",
    "-L", "/opt/musl-cross/lib/gcc/aarch64-linux-musl/11.5.0",
    "-L", "/opt/musl-cross/aarch64-linux-musl/lib",
    "-C", "link-arg=-static",
    "-C", "link-arg=-llibtiff",
    "-C", "link-arg=-llibwebp",
    "-C", "link-arg=-llibpng",
    "-C", "link-arg=-lzlib",
    "-C", "link-arg=-llibopenjp2",
    "-C", "link-arg=-llibjpeg-turbo",
    "-C", "link-arg=-llibprotobuf",
    "-C", "link-arg=-lstdc++",
    "-C", "link-arg=-lgcc",
    "-C", "link-arg=-lc",
]

Rust编译

shell 复制代码
cd /build
cargo run--target aarch64-unknown-linux-musl
# 输出:image size: 1280 x 853

# 查看文件格式,无动态链接
file target/aarch64-unknown-linux-musl/debug/opencv-cross-demo
# 输出:target/aarch64-unknown-linux-musl/debug/opencv-cross-demo: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, with debug_info, not stripped
相关推荐
起个破名想半天了43 分钟前
计算机视觉cv入门之答题卡自动批阅
人工智能·opencv·计算机视觉
朝阳5811 小时前
Rust项目GPG签名配置指南
开发语言·后端·rust
朝阳5811 小时前
Rust实现高性能目录扫描工具ll的技术解析
开发语言·后端·rust
鸿蒙布道师1 小时前
OpenAI为何觊觎Chrome?AI时代浏览器争夺战背后的深层逻辑
前端·人工智能·chrome·深度学习·opencv·自然语言处理·chatgpt
神奇侠20241 小时前
基于opencv和PaddleOCR识别身份证信息
opencv·paddleocr
满怀10154 小时前
【OpenCV图像处理实战】从基础操作到工业级应用
图像处理·人工智能·python·opencv·计算机视觉·编程入门
菜鸟射手4 小时前
QT creater和vs2017文件路径问题
linux·c++·windows·qt
Tech Synapse4 小时前
人脸识别考勤系统实现教程:基于Face-Recognition、OpenCV与SQLite
人工智能·opencv·sqlite
@Aurora.5 小时前
【项目日记(三)】
linux·服务器·网络
白总Server5 小时前
Nginx 中间件
大数据·linux·运维·服务器·nginx·bash·web