RDK X5 交叉编译OSS\QT\opencv\openssl

RDK X5 交叉编译环境配置

  • [1 资源](#1 资源)
  • [2 使用vm安装Ubuntu22.04](#2 使用vm安装Ubuntu22.04)
  • [3 安装依赖](#3 安装依赖)
  • [4 安装ide](#4 安装ide)
  • [5 下载交叉编译工具](#5 下载交叉编译工具)
  • [6 编译oss库](#6 编译oss库)
    • [6.1 设置临时环境变量](#6.1 设置临时环境变量)
    • [6.2 编译arm版本的openssl](#6.2 编译arm版本的openssl)
    • [6.2 编译arm版本的curl](#6.2 编译arm版本的curl)
    • [6.1 下载oss源码](#6.1 下载oss源码)
      • [6.1.1 创建arm-toolchain.cmake](#6.1.1 创建arm-toolchain.cmake)
      • [6.1.2 修改CMakeLists.txt](#6.1.2 修改CMakeLists.txt)
      • [6.1.3 编译](#6.1.3 编译)
  • [7 编译opencv](#7 编译opencv)
    • [7.1 下载源码](#7.1 下载源码)
    • [7.2 编译](#7.2 编译)
  • 未完待续

1 资源

  1. RDK X5:官方文档
  2. 阿里云oss资料:官方资料

2 使用vm安装Ubuntu22.04

网上很多教程,此处不在赘述,自行查找。

3 安装依赖

bash 复制代码
sudo apt-get install -y build-essential make cmake libpcre3 libpcre3-dev bc bison \
                        flex python3-numpy mtd-utils zlib1g-dev debootstrap \
                        libdata-hexdumper-perl libncurses5-dev zip qemu-user-static \
                        curl repo git liblz4-tool apt-cacher-ng libssl-dev checkpolicy autoconf \
                        android-sdk-libsparse-utils mtools parted dosfstools udev rsync
bash 复制代码
sudo apt-get install -y libcurl4-openssl-dev libssl-dev unzip
bash 复制代码
sudo apt install libxcb-cursor0 libxcb-cursor-dev

安装ssh server

bash 复制代码
sudo apt update # 更新仓库
sudo apt install openssh-server # 安装openssh
sudo vi /etc/ssh/sshd_config # 进入配置文件,找到port=22那行,取消注释
sudo service ssh restart # 重启服务,然后就可以连接了,有时候root用户连不上,可以用普通用户登录再切换到root

4 安装ide

  1. 安装VSCode:https://code.visualstudio.com/Download
  2. 安装QT:https://mirrors.tuna.tsinghua.edu.cn/qt/archive/online_installers

选择5.15.2下载

bash 复制代码
ls -l qt-online-installer-linux-x64-4.9.0.run #查看权限
chmod 777 qt-online-installer-linux-x64-4.9.0.run #赋予权限
./qt-online-installer-linux-x64-4.9.0.run --mirror https://mirrors.aliyun.com/qt #国内镜像加速

5 下载交叉编译工具

bash 复制代码
curl -fO http://archive.d-robotics.cc/toolchain/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz

sudo tar -xvf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt

6 编译oss库

6.1 设置临时环境变量

bash 复制代码
export TOOLCHAIN_DIR="/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu"
export SYSROOT="${TOOLCHAIN_DIR}/aarch64-none-linux-gnu/libc/usr"
export CXX="${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-g++"
export CC="${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-gcc"
export AR="${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-ar"
export RANLIB="${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-ranlib"

验证

bash 复制代码
echo "CC=$CC"
...

6.2 编译arm版本的openssl

bash 复制代码
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -xvf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
./Configure linux-aarch64 --prefix="${SYSROOT}" -fPIC  #no-shared
make -j$(nproc)
sudo make install # 不一定要安装,看你怎么用 如果你是用了我的arm-toolchain.cmake,那么安装的位置被强制安装到了    #set(CMAKE_INSTALL_PREFIX "${CMAKE_SYSROOT}/usr" CACHE PATH "" FORCE)  路径下面 主要目的时为了防止交叉编译的库污染系统的库

linux-aarch64:指定的平台

--prefix="${SYSROOT}:安装的路径

-fPIC:启用位置无关代码(位置无关代码(PIC) 是共享库(.so)的必要条件。当静态库(.a)被链接到共享库时,必须使用 PIC 编译。)

no-shared:禁用生成动态库

验证:

bash 复制代码
file ${TOOLCHAIN_DIR}/aarch64-none-linux-gnu/libc/usr/lib/libcrypto.a

输出:/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/lib/libcrypto.a: current ar archive

6.2 编译arm版本的curl

bash 复制代码
wget https://curl.se/download/curl-7.79.1.tar.gz
tar -xvf curl-7.79.1.tar.gz
cd curl-7.79.1
CFLAGS="-fPIC" ./configure --host=aarch64-none-linux-gnu --prefix="${SYSROOT}" --with-openssl
make -j$(nproc)
sudo make install # 不一定要安装,看你怎么用 如果你是用了我的arm-toolchain.cmake,那么安装的位置被强制安装到了    #set(CMAKE_INSTALL_PREFIX "${CMAKE_SYSROOT}/usr" CACHE PATH "" FORCE)  路径下面 主要目的时为了防止交叉编译的库污染系统的库

--host=aarch64-none-linux-gun:指定平台

--prefix="${SYSROOT}:安装的路径

--with-openssl:开启openssl支持

6.1 下载oss源码

6.1.1 创建arm-toolchain.cmake

touch arm-toolchain.cmake

bash 复制代码
# arm-toolchain.cmake

# 目标系统类型
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 交叉编译器路径
set(TOOLCHAIN_DIR "/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu")
set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_DIR}/bin/aarch64-none-linux-gnu-g++")

# 目标系统库和头文件路径
#set(CMAKE_SYSROOT "${TOOLCHAIN_DIR}/aarch64-none-linux-gnu/libc")
set(CMAKE_SYSROOT "${TOOLCHAIN_DIR}/aarch64-none-linux-gnu/libc" CACHE PATH "" FORCE)
set(CMAKE_FIND_ROOT_PATH "${CMAKE_SYSROOT}/usr")
set(CMAKE_INSTALL_PREFIX "${CMAKE_SYSROOT}/usr" CACHE PATH "" FORCE)  # 强制覆盖默认值


# 搜索策略
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)   # 不在 sysroot 中搜索可执行文件
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)    # 只在 sysroot 中搜索库
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)    # 只在 sysroot 中搜索头文件

6.1.2 修改CMakeLists.txt

下载下面的代码并解压后修改CMakeLists.txt

在37行中下面的判断平台修改:

bash 复制代码
if (CMAKE_CROSSCOMPILING)
	if (${CMAKE_SYSTEM_NAME} STREQUAL "Android")
		set(PLATFORM_ANDROID 1)
		set(TARGET_OS "ANDROID")
	elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") #增加内容
		set(PLATFORM_LINUX 1)
		set(TARGET_OS "LINUX")
	else()
		message(FATAL_ERROR "Do not support target platform")
	endif()
else()
	if(CMAKE_HOST_APPLE)
		set(PLATFORM_APPLE 1)
		set(TARGET_OS "APPLE")
	elseif(CMAKE_HOST_UNIX)
		set(PLATFORM_LINUX 1)
		set(TARGET_OS "LINUX")
	elseif(CMAKE_HOST_WIN32)
		set(PLATFORM_WINDOWS 1)
		set(TARGET_OS "WINDOWS")
	else()
		message(FATAL_ERROR "Do not support unknown host OS")
	endif()
endif()

6.1.3 编译

(直接在github上下载zip会有问题,用下面的命令下载)

bash 复制代码
sudo apt-get install -y libcurl4-openssl-dev libssl-dev unzip
wget -O aliyun-oss-cpp-sdk-master.zip "https://github.com/aliyun/aliyun-oss-cpp-sdk/archive/refs/tags/1.10.0.zip"
unzip aliyun-oss-cpp-sdk-master.zip
cd aliyun-oss-cpp-sdk-1.10.0
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_TOOLCHAIN_FILE=/home/mxw/develop/arm-toolchain.cmake ..
make -j$(nproc)
sudo make install # 不一定要安装,看你怎么用 如果你是用了我的arm-toolchain.cmake,那么安装的位置被强制安装到了    #set(CMAKE_INSTALL_PREFIX "${CMAKE_SYSROOT}/usr" CACHE PATH "" FORCE)  路径下面 主要目的时为了防止交叉编译的库污染系统的库

7 编译opencv

7.1 下载源码

bash 复制代码
git clone https://gitee.com/mqinglang/opencv.git #这是我转到国内的下载比较快
git clone https://gitee.com/mqinglang/opencv_contrib.git #扩展模块
cd opencv
git checkout 4.9.0
cd ../opencv_contrib/
git checkout 4.9.0
cd -
mkdir build

7.2 编译

对应替换路径

bash 复制代码
cmake -DCMAKE_TOOLCHAIN_FILE=/home/mxw/develop/arm-toolchain.cmake \
      -DOPENCV_EXTRA_MODULES_PATH=/home/mxw/develop/opecv/opencv_contrib/modules \
      -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_TESTS=OFF \
      -DBUILD_PERF_TESTS=OFF \
      -DBUILD_EXAMPLES=OFF \
      -DWITH_TBB=OFF \
      -DWITH_IPP=OFF \
      -DWITH_1394=OFF \
      -DWITH_GSTREAMER=OFF \
      -DWITH_FFMPEG=OFF \
      -DWITH_GTK=OFF \
      -DWITH_QT=OFF \
      -DBUILD_opencv_python_bindings_generator=OFF \
      -DBUILD_opencv_python3=OFF \
      -DBUILD_opencv_world=ON \
      /home/mxw/develop/opecv/opencv

make -j$(nproc)
sudo make install # 不一定要安装,看你怎么用 如果你是用了我的arm-toolchain.cmake,那么安装的位置被强制安装到了    #set(CMAKE_INSTALL_PREFIX "${CMAKE_SYSROOT}/usr" CACHE PATH "" FORCE)  路径下面 主要目的时为了防止交叉编译的库污染系统的库
bash 复制代码
cmake -DCMAKE_TOOLCHAIN_FILE=/home/mxw/develop/arm-toolchain.cmake \
      -DOPENCV_EXTRA_MODULES_PATH=/home/mxw/develop/opecv/opencv_contrib/modules \
      -DCMAKE_BUILD_TYPE=Release \
	  -DBUILD_TESTS=OFF \
	  -DBUILD_PERF_TESTS=OFF \
	  -DBUILD_EXAMPLES=OFF \
	  -DWITH_TBB=OFF \
	  -DWITH_IPP=OFF \
	  -DWITH_1394=OFF \
	  -DWITH_GSTREAMER=OFF \
	  -DWITH_FFMPEG=OFF \
	  -DWITH_GTK=OFF \
	  -DWITH_QT=OFF \
	  -DWITH_OPENEXR=OFF \
	  -DWITH_OPENJPEG=ON \
	  -DWITH_WEBP=ON \
	  -DWITH_PNG=ON \
	  -DWITH_JPEG=ON \
	  -DWITH_TIFF=ON \
	  -DWITH_ZLIB=ON \
	  -DWITH_OPENCL=OFF \
	  -DBUILD_opencv_python_bindings_generator=OFF \
	  -DBUILD_opencv_python3=OFF \
	  -DBUILD_opencv_world=ON \
	  /home/mxw/develop/opecv/opencv

注意:
1.因为我只使用了opencv简单的功能,为了更快的编译,我将一些选项都关掉了,如果你需要哪个对应开启即可;如果上述参数中缺少你需要的参数,自行查询这些参数并加上去即可。

2. 遇到下载失败的情况,将下载失败的文件复制链接到浏览器下载,跟下载日志复制修改成对应的md5值到opencv/.cache/xfeatures2d/...中

验证生成的库是否为arm架构
file lib/libopencv_world.so.4.9.0

输出:

lib/libopencv_world.so.4.9.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, with debug_info, not stripped

未完待续

相关推荐
景天科技苑31 分钟前
【Rust宏编程】Rust有关宏编程底层原理解析与应用实战
开发语言·后端·rust·rust宏·宏编程·rust宏编程
yorushika_1 小时前
python打卡训练营打卡记录day45
开发语言·python·深度学习·tensorboard
封奚泽优1 小时前
使用Python进行函数作画
开发语言·python
aningxiaoxixi1 小时前
JAVA之 Lambda
java·开发语言
jndingxin2 小时前
OPenCV CUDA模块目标检测----- HOG 特征提取和目标检测类cv::cuda::HOG
人工智能·opencv·目标检测
come112342 小时前
Claude 写 PHP 项目的完整小白教程
开发语言·php
虾球xz2 小时前
CppCon 2015 学习:Concurrency TS Editor’s Report
开发语言·c++·学习
板鸭〈小号〉2 小时前
命名管道实现本地通信
开发语言·c++
清醒的兰2 小时前
OpenCV 图像像素的逻辑操作
人工智能·opencv·计算机视觉
火兮明兮3 小时前
Python训练第四十五天
开发语言·python