【问题标题】:How to compile FFmpeg for arm64e - clang is unable to create an executable file如何为 arm64e 编译 FFmpeg - clang 无法创建可执行文件
【发布时间】:2021-04-11 14:47:27
【问题描述】:

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

【问题讨论】:

  • 是的,请看第二句..

标签: xcode shell ffmpeg


【解决方案1】:

我也遇到了同样的问题,查了一下,发现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

【讨论】:

  • 我必须在哪里进行更改?在构建脚本中我没有找到这样的东西。它是否适用于您在 a12z 芯片设备上的更改?
  • 嗨,我已经附上了我的脚本,它可以在 arm 和 arm64 上运行良好。你可以参考一下。并且请注意参数“CPU”,它应该以“armv*”开头。
猜你喜欢
  • 1970-01-01
  • 2021-06-16
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2021-02-04
  • 1970-01-01
相关资源
最近更新 更多