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