首页 > 解决方案 > 如何为 arm64e 编译 FFmpeg - clang 无法创建可执行文件

问题描述

我们在 Xcode/Swift 项目中使用 FFmpeg。使用 arm64 架构编译和运行应用程序效果很好。现在我们要支持带有 A12Z 芯片的设备。他们有架构“arm64e”。我们正在使用来自kewlbear 的构建脚本并将该行修改ARCHS="arm64 armv7 x86_64 i386"ARCHS="arm64e arm64 armv7 x86_64 i386". clang is unable to create an executable file当我们运行脚本时,我们在 arm64e 的构建开始时收到错误消息。我们如何解决这个问题?

标签: xcodeshellffmpeg

解决方案


我也遇到过同样的问题,检查后发现arm64的参数“--cpu”不正确。原来是“--cpu=arm64-v8a”。正确的是“--cpu=armv8-a”。“--cpu”参数必须以“armv”开头,您可以在FFMPEG配置文件中找到线索,如下所示:

case $cpu in
    armv*)
        cpuflags="-march=$cpu"
        subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
    ;;
    *)
        cpuflags="-mcpu=$cpu"
        case $cpu in
            cortex-a*)                               subarch=armv7a  ;;
            cortex-r*)                               subarch=armv7r  ;;
            cortex-m*)                 enable thumb; subarch=armv7m  ;;
            arm11*)                                  subarch=armv6   ;;
            arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
            armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
            *)                             subarch=$(probe_arm_arch) ;;
        esac
    ;;
esac

下面是我的脚本,它可以很好地工作。

#!/bin/bash

TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/
API=21


function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
    --disable-x86asm \
    --prefix=$PREFIX \
    --disable-static \
    --enable-shared \
    --enable-small \
    --enable-gpl \
    --disable-doc \
    --disable-programs \
    --disable-avdevice \
    --enable-cross-compile \
    --target-os=android \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-symver \
    --cross-prefix=$CROSS_PREFIX \
    --arch=$ARCH \
    --cpu=$CPU \
    --cc=$CC

make clean
make -j32
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
build_android

# armv8a -> arm64 -> aarch64-linux-android-
# armv7a -> arm -> arm-linux-androideabi-
# x86 -> x86 -> i686-linux-android-
# x86_64 -> x86_64 -> x86_64-linux-android-

#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
build_android

推荐阅读