[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
相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言