[T113] 交叉编译 OpenCV 4.5.2 + face 模块

1. 目标

  • 平台:全志 T113(Tina Linux)
  • OpenCV 版本:4.5.2
  • opencv_contrib:4.5.2
  • 额外模块:face
  • 安装前缀:/opt/opencv4.5.2-t113

2. 目录

bash 复制代码
# 源码目录
~/opencv-4.5.2
~/opencv_contrib-4.5.2

# 构建
~/opencv-4.5.2/build_t113

3. 准备环境变量

bash 复制代码
export OPENCV_SRC=~/opencv-4.5.2
export OPENCV_CONTRIB=~/opencv_contrib-4.5.2
export BUILD_DIR=$OPENCV_SRC/build_t113

# 目标 sysroot(target staging_dir)
export SYSROOT=~/Tina-Linux/out/t113-mq_r/staging_dir/target

mkdir -p $BUILD_DIR

4. toolchain 文件(关键,防宿主机污染)

保存为:~/opencv-4.5.2/build_t113/toolchain_t113.cmake

cmake 复制代码
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# 避免 try_run 触发目标程序运行
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

# 交叉编译器
set(CMAKE_C_COMPILER   "~/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-gcc")
set(CMAKE_CXX_COMPILER "~/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-g++")
set(CMAKE_AR           "~/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-ar")
set(CMAKE_RANLIB       "~/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-ranlib")
set(CMAKE_STRIP        "~/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-strip")

# sysroot
set(CMAKE_SYSROOT "$ENV{SYSROOT}")
set(CMAKE_FIND_ROOT_PATH "${CMAKE_SYSROOT}")

# 编译/链接都带 sysroot
set(CMAKE_C_FLAGS_INIT "--sysroot=${CMAKE_SYSROOT}")
set(CMAKE_CXX_FLAGS_INIT "--sysroot=${CMAKE_SYSROOT}")
set(CMAKE_EXE_LINKER_FLAGS_INIT "--sysroot=${CMAKE_SYSROOT}")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "--sysroot=${CMAKE_SYSROOT}")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "--sysroot=${CMAKE_SYSROOT}")

# 查找策略:程序在宿主机找,库/头/包只在目标根找
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# 禁止从宿主机环境路径捞库
set(CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH FALSE)
set(CMAKE_FIND_USE_PACKAGE_REGISTRY FALSE)
set(CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY TRUE)
set(CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY TRUE)

# pkg-config 只看 sysroot
set(ENV{PKG_CONFIG_DIR} "")
set(ENV{PKG_CONFIG_PATH} "")
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${CMAKE_SYSROOT}")
set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_SYSROOT}/usr/lib/pkgconfig:${CMAKE_SYSROOT}/usr/share/pkgconfig:${CMAKE_SYSROOT}/lib/pkgconfig")

5. CMake 配置

bash 复制代码
cd $BUILD_DIR
rm -rf CMakeCache.txt CMakeFiles

cmake .. \
  -G "Unix Makefiles" \
  -DCMAKE_MAKE_PROGRAM=/usr/bin/make \
  -DCMAKE_TOOLCHAIN_FILE=$BUILD_DIR/toolchain_t113.cmake \
  -DCMAKE_INSTALL_PREFIX=/opt/opencv4.5.2-t113 \
  -DOPENCV_EXTRA_MODULES_PATH=$OPENCV_CONTRIB/modules/face

6. 编译与安装

bash 复制代码
cd $BUILD_DIR
make -j$(nproc)
make install

7. 构建结果确认

7.1 库数量确认
bash 复制代码
find /opt/opencv4.5.2-t113/lib -maxdepth 1 -name 'libopencv*.so*' | wc -l

本次结果:48(16 模块 × 3 个 so 链接/版本文件)

7.2 架构确认
bash 复制代码
file /opt/opencv4.5.2-t113/lib/libopencv_core.so.4.5.2
file /opt/opencv4.5.2-t113/lib/libopencv_face.so.4.5.2

应为:ELF 32-bit ... ARM

7.3 宿主机污染检查
bash 复制代码
grep -E "/usr/lib|/usr/local|/lib32|x86_64" $BUILD_DIR/CMakeCache.txt
相关推荐
FakeOccupational35 分钟前
【电路笔记 信号】DBPSK 波形查找表+脉冲成形(升余弦+根升余弦滤波)
开发语言·笔记
谷哥的小弟1 小时前
CentOS Stream浴火重生
linux·运维·centos
程序员-Benothing2 小时前
Shell输入输出详解:read、echo、printf、颜色输出
linux·运维·服务器
FPGA小徐2 小时前
从 NEMU 到 AbstractMachine:程序、运行时环境与 AM 完全解析
linux·运维·服务器
xailorliu4 小时前
SLIC_超像素算法
c++·opencv·目标检测·机器学习·计算机视觉
qetfw4 小时前
Debian Chrony 时间同步、RAID5 与 LUKS 磁盘加密配置
linux·debian
Horn Still Sounds4 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
东城居士6 小时前
Linux驱动阻塞与非阻塞访问的理解
linux·嵌入式系统
..Dauntless..6 小时前
【Linux】进程地址空间初步理解
linux·运维·服务器
Julien20046 小时前
Docker 网络(一)
linux·运维·服务器·ssh·学习方法