交叉编译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") # infoset(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到哪个库的文件夹

总结

交叉编译真麻烦…

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java零基础入门-Comparable vs Comparator(上)

哈喽,各位小伙伴们好,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。 我是一名java开发,所以日常接触到最多…

System是什么?为什么不能直接输出null?

在看学习下面的知识前,得先对java核心类库有个大致的了解,详情可参考链接 java基本概念-扩展点-CSDN博客 1、System 1.1 System是什么? System是一个类,它包含了一些有用的属性和方法。 1.2 System实现的功能 (1&…

【深度学习】换脸新科技,InstantID: Zero-shot Identity-Preserving Generation in Seconds

论文:https://arxiv.org/abs/2401.07519 代码:https://github.com/InstantID/InstantID demo:https://huggingface.co/spaces/InstantX/InstantID 文章目录 1 引言2 相关工作2.1 文本到图像扩散模型2.2 主题驱动的图像生成2.3 保持ID的图像生成 3 方法3.…

zabbix5监控tomcat

zabbix tomcat客户端配置 1、配置tomcat catalina.sh文件 CATALINA_OPTS"$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port12345 -Dcom.sun.management.jmxremote.authenticatefalse -Dcom.sun.management.jmxremote.sslfalse -Djav…

smart-doc 社区 Committer 晋升公告

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

Vue3全家桶 - Vue3 - 【3】模板语法(指令+修饰符 + v-model语法糖)

一、模板语法 主要还是记录一些指令的使用和vue2的区别;vue3指令导航; 1.1 v-text 和 v-html 指令的区别: v-text: 更新元素的文本内容;v-text 通过设置元素的 textContent 属性来工作,因此它将覆盖元素…

数据结构:静态链表(编程技巧)

链表的元素用数组存储, 用数组的下标模拟指针。 一、理解 如果有些程序设计语言没有指针类型,如何实现链表? 在使用指针类型实现链表时,我们很容易就可以直接在内存中新建一块地址用于创建下一个结点,在逻辑上&#x…

3、设计模式之工厂模式

工厂模式是什么?     工厂模式是一种创建者模式,用于封装和管理对象的创建,屏蔽了大量的创建细节,根据抽象程度不同,主要分为简单工厂模式、工厂方法模式以及抽象工厂模式。 简单工厂模式 看一个具体的需求 看一个…

面向对象(精髓)变继承关系为组和关系(_Decorator模式)

在软件开发中,设计模式是解决常见问题的可重用解决方案。在面向对象编程中,继承和组合是两种常用的代码复用方式。然而,随着软件需求的不断变化,我们需要更灵活的设计方式来应对不断变化的需求。在本文中,我们将讨论从…

计算机网络——TCP/IP网络层次模型

计算机网络——TCP/IP网络层次模型 TCP/IP网络模型的起源TCP/IP网络层次的结构TCP/IP如何交互 TCP/IP协议栈TCP/IP协议栈主要协议 TCP/IP 和 OSI之间的区别面向连接和无连接面向连接三次握手,四次挥手 无连接 我们上一次了解了OSI的网络层次模型,如果还没…

Linux学习-内存管理

目录 内存管理 malloc free 使用 字符串存储申请堆区 自主输入个数,然后通过malloc在程序中申请空间,不用必须提前指定大小 内存溢出 内存泄漏 内存碎片 内存管理 函数名就是指向该函数的函数指针。 堆区是自低向高,栈区是自高向低…

ffmpeg日记4001-原理介绍-视频切割原理

原理 打开输入---->打开输出---->根据输入来创建流---->拷贝流设置---->循环读帧---->判断时间点是否到达切割点,并做设置---->设置pts和dts---->写入---->善后 重点是pts和dts如何设置。参考《ffmpeg学习日记25-pts,dts概念的…

ftp速度太慢只有几十k,怎么解决?

FTP是目前许多企业日常运营中还在用的文件传输方式。虽然比较普遍,然而,许多用户在使用FTP时经常遇到速度缓慢的问题,有时甚至只有几十KB/s。这不仅影响工作效率,还可能导致许多数据传输的延迟的问题。本文将探讨FTP速度慢的原因&…

计算机服务器中了faust勒索病毒怎么解密,faust勒索病毒解密工具流程

在互联网飞速发展的今天,越来越多的企业走向了数字化办公模式,许多企业开始利用网络计算机开展各项工作业务,网络也为企业的生产效率提供了极大便利,但网络中存在许多恶意威胁。近日,云天数据恢复中心接到许多企业的求…

Java 学习和实践笔记(34):对象的转型(casting)

对象的转型(casting)有两种,一种是向上转型,一种是向下转型。 向上转型:父类引用指向子类对象。这属于自动类型转换,编译器会自动完成。 上一节的多态中,形参为父类Animal, 但是调用时实参为子类对象Dog&…

linux中查看并修改日期

1.如何在终端控制行界面显示并且调整日期: 显示当前日期: 2.显示当前年份: 3.显示当前月份: 4.显示当前天数: 5.显示到目前为止的天数: 6.显示日期: date “%x“ ≈ date ”%Y %m %d"…

09-设计模式 面试题

你之前项目中用过设计模式吗? 工厂方法模式分类 简单工厂模式工厂方法模式抽象工厂模式工厂模式 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore)…

一、什么是 HarmonyOS ?

HarmonyOS 是华为开发的一款面向未来的全场景分布式智慧操作系统,将逐步覆盖 18N 全场景终端设备。 对消费者而言,HarmonyOS 用一个“统一的软件系统”,从根本上解决消费者面对大量智能终端体验割裂的问题,为消费者带来统一、便利…

Kafka Stream入门

1. 什么是流式计算 流式计算(Stream Processing)是一种计算模型,旨在处理连续的数据流。与传统的批处理模型不同,流式计算可以实时或接近实时地处理和分析数据,这意味着数据在生成后不久就被处理,而不是存…

基于android的物业管理系统的设计与实现19.8

目录 基于android的物业管理系统的设计与实现 3 摘 要 3 Android property managemengt system 5 Abstract 5 1 绪论 6 1.1 选题背景 6 1.2 课题研究现状 6 1.3 设计研究主要内容 7 1.4 系统主要设计思想 8 2 开发环境 8 2.1 Android系统的结构 8 图2-1 Android系统架构图 9 2…