Ubuntu24.04 交叉编译 aarch64 ffmpeg

ffmpeg

安装依赖

sudo apt install \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libgnutls28-dev \
  libmp3lame-dev \
  libsdl2-dev \
  libtool \
  libva-dev \
  libvdpau-dev \
  libvorbis-dev \
  libxcb1-dev \
  libxcb-shm0-dev \
  libxcb-xfixes0-dev \
  meson \
  ninja-build \
  pkg-config \
  texinfo \
  wget \
  yasm \
  zlib1g-dev

sudo apt install libunistring-dev libaom-dev libdav1d-dev

下载源代码

下载页拉到下方 Releases 位置, 下载最新的代码包, 当前版本是 FFmpeg 7.1.1 “Péter”

解压到本地, 在与 ffmpeg-7.1.1 同一级目录下再建一个目录用作 install 的目标目录

configure

设置交叉编译的gcc工具链路径, 设置 install 的目标路径

通过./configure --help可以查看所有的选项.

如果只编译指定的解码器, 可以用--disable-decoders --enable-decoder=h264这样的参数组合, 编码器也是同理.

默认编译所有的编解码器, 执行 configure

./configure --enable-cross-compile --target-os=linux --arch=arm64 \
--cross-prefix=/opt/gcc-arm/aarch64-buildroot-linux-gnu-gcc-12.3.0/bin/aarch64-buildroot-linux-gnu- \
--cc=/opt/gcc-arm/aarch64-buildroot-linux-gnu-gcc-12.3.0/bin/aarch64-buildroot-linux-gnu-gcc \
--cxx=/opt/gcc-arm/aarch64-buildroot-linux-gnu-gcc-12.3.0/bin/aarch64-buildroot-linux-gnu-g++ \
--prefix=/home/milton/WorkC/ffmpeg-7.1.1-lib \
--disable-asm  --enable-parsers --disable-debug \
--enable-ffmpeg --enable-shared --disable-static \
--disable-stripping --disable-doc

然后编译

make -j4

安装

make install

会在目录下生成对应的 bin, include 和 lib

├── bin
│   ├── ffmpeg
│   └── ffprobe
├── include
│   ├── libavcodec
│   ├── libavdevice
│   ├── libavfilter
│   ├── libavformat
│   ├── libavutil
│   ├── libswresample
│   └── libswscale
├── lib
│   ├── libavcodec.so -> libavcodec.so.61.19.101
│   ├── libavcodec.so.61 -> libavcodec.so.61.19.101
│   ├── libavcodec.so.61.19.101
|   |   ...
│   ├── libswscale.so.8 -> libswscale.so.8.3.100
│   ├── libswscale.so.8.3.100
│   └── pkgconfig
└── share
    └── ffmpeg

查看二进制文件是X64还是Aarch64

file

$ file bin/ffmpeg
bin/ffmpeg: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with debug_info, not stripped

objdump

$ objdump -f bin/ffmpeg 

bin/ffmpeg:     file format elf64-little
architecture: UNKNOWN!, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x000000000000edc0

readelf

$ readelf -h bin/ffmpeg
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Position-Independent Executable file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0xedc0
  Start of program headers:          64 (bytes into file)
  Start of section headers:          382240 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         9
  Size of section headers:           64 (bytes)
  Number of section headers:         37
  Section header string table index: 36
<think>嗯,用户想了解在Ubuntu 24.04上如何交叉编译AArch64架构的C++程序,并且进行本地验证。我需要仔细思考这个过程,确保步骤正确无误。 首先,交叉编译通常需要安装对应的工具链。对于AArch64(也就是ARM64),常用的工具链应该是g++-aarch64-linux-gnu。可能还需要安装相关的库文件。用户可能已经知道一些基本概念,但可能需要详细的步骤指导。 安装交叉编译工具链。在Ubuntu中,通常可以通过apt-get安装。我需要确认包的名字是否正确,可能需要检查是否存在g++-aarch64-linux-gnu或者交叉编译相关的包。比如,运行sudo apt install g++-aarch64-linux-gnu。同时,可能还需要安装标准库,比如libstdc++6之类的,但可能工具链已经包含这些了。 然后,编写一个简单的C++程序,比如Hello World,作为测试用例。用户可能需要示例代码,所以提供一个简单的例子会更好。比如使用iostream输出。 接下来,编译命令。使用aarch64-linux-gnu-g++,可能需要指定-static选项来静态链接,避免动态库的问题。或者如果动态链接,需要将依赖的库也放到目标平台上。但用户可能希望在本地验证,所以静态编译可能更方便。 编译命令可能类似于:aarch64-linux-gnu-g++ -o hello hello.cpp -static。这样生成的可执行文件就可以在没有相应库的设备上运行。 然后是如何在本地验证。用户可能没有物理的ARM设备,所以需要使用qemu-user来进行模拟运行。需要安装qemu-user-static包,这样可以在x86_64主机上运行ARM程序。 安装qemu的部分可能需要sudo apt install qemu-user-static。然后使用qemu-aarch64-static来运行程序,例如qemu-aarch64-static ./hello。不过可能需要使用绝对路径或者正确配置才能运行。 另外,可能需要检查动态链接的情况。如果编译时没有使用-static,则需要确保相应的库存在。可以使用ldd命令的交叉编译版本,比如aarch64-linux-gnu-ldd hello,但需要确认是否可用。或者使用qemu的模式来检查依赖。 用户可能遇到的常见问题包括工具链安装失败、编译时找不到头文件或库、运行时缺少依赖库或者qemu配置不正确。需要指出可能的错误及解决方法,比如确认工具链是否正确安装,是否安装了必要的库,或者在动态链接时设置QEMU_LD_PREFIX环境变量指向sysroot。 另外,可能提到使用CMake进行交叉编译的情况,如果用户的项目比较大,可能需要配置CMake工具链文件。这部分可能用户暂时不需要,但如果有高级需求,可以简要提及。 总结步骤应该是: 1. 安装交叉编译工具链和qemu。 2. 编写测试程序。 3. 使用交叉编译器编译,静态链接。 4. 使用qemu运行进行验证。 需要确保每一步都清晰,命令准确,避免用户执行时出错。同时,提醒用户注意权限问题,比如安装软件需要sudo,运行qemu可能需要正确路径设置。 最后,验证步骤是否正确,比如运行后输出Hello World,说明成功。如果出现无法执行二进制文件,可能是架构不正确或者qemu未正确安装。</think>在 Ubuntu 24.04交叉编译 AArch64(ARM64)架构的 C++ 程序并本地验证的步骤如下: --- ### **1. 安装交叉编译工具链** ```bash sudo apt update sudo apt install g++-aarch64-linux-gnu # 安装 AArch64 交叉编译器 sudo apt install qemu-user-static # 安装 QEMU 用户态模拟器(用于本地验证) ``` --- ### **2. 编写测试程序** 创建一个简单的 C++ 文件(如 `hello.cpp`): ```cpp #include <iostream> int main() { std::cout << "Hello, AArch64!" << std::endl; return 0; } ``` --- ### **3. 交叉编译程序** 使用以下命令编译(静态链接推荐): ```bash # 静态编译(避免依赖动态库) aarch64-linux-gnu-g++ -o hello hello.cpp -static # 动态编译(需处理动态库依赖,见下方注意事项) # aarch64-linux-gnu-g++ -o hello hello.cpp ``` --- ### **4. 本地验证程序** 通过 QEMU 模拟运行 AArch64 程序: ```bash qemu-aarch64-static ./hello ``` 输出 `Hello, AArch64!` 即表示成功。 --- ### **常见问题与注意事项** #### **动态编译依赖库问题** 若未使用 `-static`,需确保目标设备有对应动态库,或通过以下方式在本地验证: 1. 安装 AArch64 动态库: ```bash sudo apt install libstdc++6:arm64 ``` 2. 指定 QEMU 的库搜索路径: ```bash qemu-aarch64-static -L /usr/aarch64-linux-gnu/ ./hello ``` #### **检查文件架构** 确认生成的可执行文件为 AArch64 格式: ```bash file hello # 应输出:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, BuildID[sha1]=... ``` --- ### **高级用法:CMake 交叉编译** 若使用 CMake,创建工具链文件 `aarch64-toolchain.cmake`: ```cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) ``` 编译命令: ```bash mkdir build && cd build cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64-toolchain.cmake .. make ``` --- 通过上述步骤,你可以完成 AArch64 程序的交叉编译,并直接在 x86_64 主机上验证结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值