交叉编译x264 zlib ffmpeg以及OpenCV等 以及解决交叉编译OpenCV时ffmpeg始终为NO的问题

文章目录

  • 环境
  • 编译流程
      • nasm编译
      • x264编译
      • zlib编译
      • libJPEG编译
      • libPNG编译
      • libtiff编译
    • FFmpeg编译
    • OpenCV编译
    • 问题1
      • 解决方案
    • 问题2
      • 解决方案
    • 总结

环境

  • 系统:Ubutu 18.04
  • 交叉编译链:gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 我的路径/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
  • OpenCV 3.4.16
  • FFmpeg n3.4.12
  • zlib 1.3.1
  • 好多包找不到哪里下的了备份在这里

编译流程

nasm编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure --host=aarch64-linux --prefix=/home/lei/RK_Lib/nasm-lib --enable-shared CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc --disable-asm

x264编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure --enable-shared --enable-static --disable-asm --prefix=/home/lei/RK_Lib/x264-lib --host=aarch64-linux --cross-prefix=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- --extra-libs=-ldl --disable-opencl

zlib编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure --prefix=/home/lei/RK_Lib/zlib-lib
    修改makefile: 替换gcc为/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc

libJPEG编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc --host=aarch64-linux --prefix=/home/lei/RK_Lib/JPEG-lib --enable-shared --enable-static

libPNG编译

  • 下载源码并解压
  • mkdir build && cd build
  • 将zlib 下的inlcue中的文件和lib中的文件拷贝交叉编译器下的目录/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/include lib
  • ../configure CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc --host=aarch64-linux --prefix=/home/lei/RK_Lib/PNG-lib --enable-shared --enable-static

libtiff编译

  • 下载源码并解压
  • mkdir build && cd build
  • ../configure CC=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc CXX=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++ --host=arm-linux --prefix=/home/lei/RK_Lib/tiff-lib --enable-shared --enable-static

FFmpeg编译

  • 下载源码并解压
  • mkdir build && cd build
  • 创建/home/lei/RK_Lib/arm-lib/include 和 /home/lei/RK_Lib/arm-lib/lib并将x264和zlib编译出的include和lib复制进去
  • ../configure --enable-shared --enable-static --prefix=/home/lei/RK_Lib/ffmpeg-lib3 --cross-prefix=/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- --arch=aarch64 --target-os=linux --enable-gpl --enable-ffmpeg --enable-libx264 --enable-zlib --enable-avresample --extra-cflags=-I/home/lei/RK_Lib/arm-lib/include --extra-ldflags=-L/home/lei/RK_Lib/arm-lib/lib

OpenCV编译

  • 下载源码并解压
  • mkdir build && cd build
  • 将编译出的FFmpeg的include和lib也复制到/home/lei/RK_Lib/arm-lib/include 和 /home/lei/RK_Lib/arm-lib/lib
  • /home/lei/RK_Lib/arm-lib目录下创建ffmpeg-config.cmake并编辑
set(ffmpeg_path "${CMAKE_CURRENT_LIST_DIR}")

message("ffmpeg_path: ${ffmpeg_path}")

set(FFMPEG_EXEC_DIR "${ffmpeg_path}/bin")
set(FFMPEG_LIBDIR "${ffmpeg_path}/lib")
set(FFMPEG_INCLUDE_DIRS "${ffmpeg_path}/include")

# library names
set(FFMPEG_LIBRARIES
    ${FFMPEG_LIBDIR}/libavformat.so
    ${FFMPEG_LIBDIR}/libavdevice.so
    ${FFMPEG_LIBDIR}/libavcodec.so
    ${FFMPEG_LIBDIR}/libavutil.so
    ${FFMPEG_LIBDIR}/libswscale.so
    ${FFMPEG_LIBDIR}/libswresample.so
    ${FFMPEG_LIBDIR}/libavfilter.so
    ${FFMPEG_LIBDIR}/libavresample.so
    ${FFMPEG_LIBDIR}/libz.so
    ${FFMPEG_LIBDIR}/libx264.so
)

# found status
set(FFMPEG_libavformat_FOUND TRUE)
set(FFMPEG_libavdevice_FOUND TRUE)
set(FFMPEG_libavcodec_FOUND TRUE)
set(FFMPEG_libavutil_FOUND TRUE)
set(FFMPEG_libswscale_FOUND TRUE)
set(FFMPEG_libswresample_FOUND TRUE)
set(FFMPEG_libavfilter_FOUND TRUE)
set(FFMPEG_libavresample_FOUND TRUE)

# library versions, 注意这几个变量,一定要设置为全局CACHE变量
set(FFMPEG_libavutil_VERSION 55.78.100 CACHE INTERNAL "FFMPEG_libavutil_VERSION") # info
set(FFMPEG_libavcodec_VERSION 57.107.100 CACHE INTERNAL "FFMPEG_libavcodec_VERSION") # info
set(FFMPEG_libavformat_VERSION 57.83.100 CACHE INTERNAL "FFMPEG_libavformat_VERSION") # info
set(FFMPEG_libavdevice_VERSION 57.10.100 CACHE INTERNAL "FFMPEG_libavdevice_VERSION") # info
set(FFMPEG_libavfilter_VERSION 6.107.100 CACHE INTERNAL "FFMPEG_libavfilter_VERSION") # info
set(FFMPEG_libswscale_VERSION 4.8.100 CACHE INTERNAL "FFMPEG_libswscale_VERSION") # info
set(FFMPEG_libswresample_VERSION 2.9.100 CACHE INTERNAL "FFMPEG_libswresample_VERSION") # info
set(FFMPEG_libavresample_VERSION 3.7.0 CACHE INTERNAL "FFMPEG_libavresample_VERSION") # info

set(FFMPEG_FOUND TRUE)
set(FFMPEG_LIBS ${FFMPEG_LIBRARIES})

status("    #################################### FFMPEG:"       FFMPEG_FOUND         THEN "YES (find_package)"                       ELSE "NO (find_package)")
status("      avcodec:"      FFMPEG_libavcodec_VERSION    THEN "YES (${FFMPEG_libavcodec_VERSION})"    ELSE NO)
status("      avformat:"     FFMPEG_libavformat_VERSION   THEN "YES (${FFMPEG_libavformat_VERSION})"   ELSE NO)
status("      avutil:"       FFMPEG_libavutil_VERSION     THEN "YES (${FFMPEG_libavutil_VERSION})"     ELSE NO)
status("      swscale:"      FFMPEG_libswscale_VERSION    THEN "YES (${FFMPEG_libswscale_VERSION})"    ELSE NO)
status("      avresample:"   FFMPEG_libavresample_VERSION THEN "YES (${FFMPEG_libavresample_VERSION})" ELSE NO)

注意这里需要把zlib和x264的库文件也指定好

-进入opencv/build目录下,执行 vim toolchain.cmake并写入以下内容,具体路径自行指定:

set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR aarch64 )
set( CMAKE_C_COMPILER /opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc )
set( CMAKE_CXX_COMPILER /opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++ )
set( CMAKE_FIND_ROOT_PATH "/home/lei/RK_Lib/arm-lib/lib" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
  • 修改OpenCV的CMakeLists.txt
# opencv.hpp and legacy headers
link_directories(/home/lei/RK_Lib/arm-lib/lib)  # 添加这句
add_subdirectory(include)
  • 修改OpenCVFindLibsVideo.cmake把message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")取消注释,以便查看FFmpeg编译输出信息

  • 终端执行

cmake -D CMAKE_TOOLCHAIN_FILE=toolchain.cmake \
 -D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no -D PYTHON3_EXECUTABLE=/usr/bin/python3.6m -D PYTHON3_INCLUDE_DIR=/usr/include/python3.6m -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3.6m \
 -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/home/lei/RK_Lib/opencv-lib \ 
 -D BUILD_ZLIB=ON -D BUILD_JPEG=ON -D BUILD_PNG=ON -D BUILD_TIFF=ON \
 -D ENABLE_CXX11=ON \
 -D WITH_FFMPEG=ON -D WITH_OPENCL=ON -D WITH_GTK=OFF -D WITH_OPENGL=ON -D WITH_ZLIB=ON -D WITH_OPENMP=ON -D WITH_PNG=ON \
 -D BUILD_SHARED_LIBS=OFF \
-D CMAKE_FIND_ROOT_PATH=/home/lei/RK_Lib/arm-lib \
-D BUILD_TESTS=ON \
-D FFMPEG_INCLUDE_DIRS=/home/lei/RK_Lib/arm-lib/include \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_FFMPEG_USE_FIND_PACKAGE=ON \
-D OPENCV_FFMPEG_SKIP_BUILD_CHECK=ON \
-D FFMPEG_DIR=/home/lei/RK_Lib/arm-lib \
..
  • 执行make -j8
  • 执行make install

问题1

执行config出现ffmpeg为NO:

解决方案

一开始确实遇到了这个问题,添加ffmpeg-config.cmake等文件后可以解决。

问题2

在这里插入图片描述>在这里插入图片描述

这里我没找到很好的解决方案,按照下面的方案解决需要重复修改link.txt文件若干次…慢慢来吧,这玩意确实需要耐心。

解决方案

比如进入path/opencv-3.4.16/build/modules/videoio/CMakeFiles/opencv_test_videoio.dir目录下修改link.txt,在/opt/toolchain/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++后面添加 -Wl,-rpath-link,/home/lei/RK_Lib/arm-lib/lib并保存重新执行make

反正就是找不到哪个库就-rpath到哪个库的文件夹

总结

交叉编译真麻烦…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/449197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter】报错Target of URI doesn‘t exist ‘package:flutter/material.dart‘

运行别人项目 包无法导入报错:Target of URI doesn’t exist ‘package:flutter/material.dart’ 解决方法 flutter packages get成功 不会报错

php CI框架异常报错通过钉钉自定义机器人发送

php CI框架异常报错通过钉钉自定义机器人发送 文章目录 php CI框架异常报错通过钉钉自定义机器人发送前言一、封装一个异常监测二、封装好钉钉信息发送总结 前言 我们在项目开发中,经常会遇到自己测试接口没问题,上线之后就会测出各种问题,主…

K8s — PVC|PV Terminating State

在本文中,我们将讨论PV和PVC一直Terminating的状态。 何时会Terminting? 在以下情况下,资源将处于Terminating状态。 在删除Bounded 状态的PVC之前,删除了对应的PV,PV在删除后是Terminting状态。删除PVC时,仍有引用…

python向多个用户发送文字、图片内容邮件和excel附件

话不多说,直接上代码,需要把发件里面的smtp_info替换为自己的信息,其中password是指邮箱在开通POP/SMTP功能后获取的授权码! import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import M…

案例分析篇05:数据库设计相关28个考点(9~16)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

web3D三维引擎(Direct3D、OpenGL、UE、U3D、threejs)基础扫盲

Hi,我是贝格前端工场的老司机,本文介绍文web3D的几个引擎,做个基础扫盲,如果还不能解决问题,可以私信我,搞私人订制呦。 三维引擎是指用于创建和渲染三维图形的软件框架。它们通常提供了图形处理、物理模拟…

案例分析篇02:软件架构设计考点之特定领域软件架构、架构评估、架构视图(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

2024RKDC,新一代AIOT 处理器RK3576发布 !

触觉智能已成功推出RK3576相关开发板核心板,RK3576采用瑞芯微八核芯片,专为 AI0I设计,可用于平板电脑、AI0T应用程序、电子墨水显示器、Arm PC和汽车电子中。集成独立的6TOPS NPU,支持4K视频编解码,性能定位于RK3588和…

smart-doc 社区 Committer 晋升公告

我们非常荣幸地宣布,经过 PMC 委员会的提名和讨论,社区成员李星志(GitHub ID: netdied)、陈琪(GitHub ID: chenqi146)和李兵(GitHub ID: abing22333)正式晋升为同程旅行 smart-doc 开…

redis概述和安装

1 、redis概述和安装 1.1、安装redis 1. 下载redis2. 地址 : https://download.redis.io/releases/ 3. 选择需要的版本1.2 将 redis 安装包拷贝到 /opt/ 目录 1.3. 解压 tar -zvxf redis-6.2.1.tar.gz1.4. 安装gcc yum install gcc1.5. 进入目录 cd redis-6.2.11.6 编译 …

微信小程序云开发教程——墨刀原型工具入门(素材面板)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

“2024成都国际电子信息产业展览会”新西部、新重构、新机遇

随着西部大开发和科技兴国的战略深入实施,四川的经济发展已经取得了令人瞩目的成就。作为西部的核心,四川在能源化工、装备制造、航天科技等产业方面均处于国内领先地位,同时也是全国重要的基础电子装备基地。这一发展背景为2024年成都国际电…

ETL的数据挖掘方式

ETL的基本概念 数据抽取(Extraction):从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作,从API接口拿取数据也是。 数据转换(Transformation):清洗、整合和转…

常用云产品连接

阿里云常用云产品 云服务器 阿里云:云服务器ECS_云主机_服务器托管_计算-阿里云 对象存储 阿里云:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 短信服务 阿里云:短信服务_企业短信营销推广_验证码通知-阿里云 CDN服务 阿里云&…

redis源码分析

是什么 是基于内存(而不是磁盘)的kv(而不是关系型mysql那种)数据库,通过空间换时间 源码分析 跳表skiplist 假设你有个有序链表,你想看某个特定的值是否出现在这个链表中,那你是不是只能遍历一次链表才能知道,时间复杂度为O(n…

如何搭建财务数据运营体系:基于财务五力模型的分析

在当今复杂多变的商业环境中,财务数据作为企业决策的重要参考依据,其运营体系的搭建显得尤为关键。一个健全、高效的财务数据运营体系不仅能够为企业提供准确的财务数据支持,还能帮助企业在激烈的市场竞争中保持领先地位。基于财务五力模型的分析,我们可以从收益力、安定力…

windows server 2019 服务器配置的方法步骤

一、启用远程功能二、测试三、解决多用户登录的问题 一、启用远程功能 右键点击【此电脑】–【属性】,进入“【控制面板\系统和安全\系统】”,点击-【远程设置】(计算机找不到就使用【winE】快捷键) 2、在“远程桌面”下方,点击【允许远程连…

NOIP2018-S-DAY1-3-赛道修建(洛谷P5021)的题解

目录 题目 原题描述: 题目描述 输入格式 输出格式 输入输出样例 主要思路: check: 真正的code: 原题描述: 题目描述 C 城将要举办一系列的赛车比赛。在比赛前,需要在城内修建 条赛道。 C 城一共有 个路…

gitee分支管理,合并冲突

1、gitee展示分支 git branch 2、展示远程分支 git branch -r 3、新建分支 git branch base 4、切换分支 git checkout base 合并冲突 当代码在服务器上被提交了,再在本地提交会提示报错 点击merge

从GPT入门,到R语言基础与作图、回归模型分析、混合效应模型、多元统计分析及结构方程模型、Meta分析、随机森林模型及贝叶斯回归分析综合应用等专题及实战案例

目录 专题一 GPT及大语言模型简介及使用入门 专题二 GPT与R语言基础与作图(ggplot2) 专题三 GPT与R语言回归模型(lm&glm) 专题四 GPT与混合效应模型(lmm&glmm) 专题五 GPT与多元统计分析&…