【问题标题】:Static linking FFmpeg libraries on android在android上静态链接FFmpeg库
【发布时间】:2018-03-17 14:39:27
【问题描述】:

我正在尝试在 MacOS Sierra 机器上为 android 构建 FFmpeg 作为静态库

以下是我的buildscript.sh,它非常基于here中的@

#!/bin/bash

cd ffmpeg-3.3.4

NDK=/path/to/android/ndk/android-ndk-r15c
SYSROOT=$NDK/platforms/android-21/arch-arm64/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc
CXX=$TOOLCHAIN/bin/arm-linux-androideabi-g++
LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
X264LIB=$X264/android/arm/lib/
X264INC=$X264/android/arm/include/

function build_ffmpeg_android {

./configure \
    --prefix=$PREFIX \
    --disable-stripping
    --arch=arm \
    --cpu=cortex-a8 \
    --target-os=linux \
    --enable-cross-compile \
    --enable-pic \
    --disable-programs \
    --enable-static \
    --disable-shared \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --disable-doc \
    --enable-postproc \
    --enable-swscale \
    --enable-avfilter \
    --enable-avresample \
    --disable-opencl \
    --disable-securetransport \
    --enable-gpl \
    --sysroot=$SYSROOT \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS -I$X264INC"  \
    --extra-ldflags="$ADDI_LDFLAGS -s -L$X264LIB -lx264" \
    --enable-gpl \
    --enable-decoders \
    --enable-encoders \
    --enable-muxers \
    --enable-demuxers \
    --enable-parsers \
    --enable-protocols \
    --enable-filters \
    --enable-avresample \
    --enable-libfreetype \
    --disable-indevs \
    --enable-indev=lavfi \
    --disable-outdevs \
    --enable-hwaccels \
    --enable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-network \
    --enable-libx264 \
    --enable-zlib \
    --enable-muxer=md5
    make clean
    make -j9
    make install
}

CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"

build_ffmpeg_android

上面脚本的输出放在ffmpeg-3.3.4/android/arm里面。

我的问题:
当尝试使用 -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice 从我的应用程序链接到这些 .a 库时,
我收到以下 链接器错误 他们每个人

:-1: error: error: avformat: no archive symbol table (run ranlib)
:-1: error: error: avcodec: no archive symbol table (run ranlib)
:-1: error: error: swscale: no archive symbol table (run ranlib)
:-1: error: error: avutil: no archive symbol table (run ranlib)
:-1: error: error: avfilter: no archive symbol table (run ranlib)
:-1: error: error: swresample: no archive symbol table (run ranlib)
:-1: error: error: avdevice: no archive symbol table (run ranlib)

查看this discussion here,我在CPREFIX 中选择arm-linux-androideabi-ar 是正确的。

为了解决这个错误,我还为ranlib 添加了以下配置标志,以便专门为 android 选择,但似乎没有帮助。

RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib

我的问题:

  • 我还缺少什么?
  • 我的 buildscript.sh 需要什么来选择正确的 ranlib 并在从我的应用程序链接时停止抱怨存档符号表?

【问题讨论】:

  • CPREFIX 应该是$TOOLCHAIN/bin/arm-linux-androideabi-,不是ar
  • @AlexCohn 可以将AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar 设置为配置标志之一吗?
  • @AlexCohn 在问题中再次更新了我的脚本。我一直在拼命地尝试很多事情。但是这个错误没有成功:(如果你看一下我的脚本将不胜感激。请看一下。我已经更新了 no ar 建议但仍然不起作用。仍然缺少一些东西
  • 现在为这个问题添加了赏金以引起关注

标签: ffmpeg android-ndk static-libraries static-linking configure


【解决方案1】:

以下是正确的配置标志:

./configure \
  --prefix=$PREFIX \
  --disable-stripping \
  --arch=arm \
  --cpu=armv5te \
  --disable-asm \
  --target-os=linux \
  --enable-cross-compile \
  --enable-debug \
  --enable-pic \
  --disable-programs \
  --enable-static \
  --disable-shared \
  --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
  --disable-doc \
  --enable-postproc \
  --enable-swscale \
  --enable-avfilter \
  --enable-avresample \
  --disable-opencl \
  --disable-securetransport \
  --sysroot=$SYSROOT \
  --enable-videotoolbox \
  --enable-avresample \
  --disable-symver \
  --extra-cflags="-O3 -Wall -pipe -std=c99 -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID -DNDEBUG-march=armv5te -mtune=arm9tdmi -msoft-float"
  $ADDITIONAL_CONFIGURE_FLAG
  make clean
  make -j9
  make install

注意以下 cflags 在 android 上会有所不同

--extra-cflags="-O3 -Wall -pipe -std=c99 -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID -DNDEBUG-march=armv5te -mtune=arm9tdmi -msoft-float"

【讨论】:

    【解决方案2】:

    花了一天时间尝试使用更新的 x265 for Android 构建 ffmpeg。

    x265 成功编译成静态库,但是当它包含在 ffmpeg 中时,我收到错误:

    ...aarch64-linux-android/bin/ld.gold: error: x265: no archive symbol table (run ranlib)
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    C compiler test failed.
    

    在网络上很难找到有关此错误的任何信息,我几乎尝试了所有方法。 但是...在我的情况下,您所要做的就是更新您的 CMAKE 版本。

    cmake 3.20.5 is installed but outdated
    ==> Upgrading cmake
      3.20.5 -> 3.21.0 
    

    在此之前,我有 cmake 3.10.2.4988404 并且一切都按预期工作,然后 Homebrew 将 cmake 更新为某些包的依赖项,并且开始头疼。 总结一下: ffmpeg+x265 的“稳定”版本的 cmake 是 3.10.23.21.0

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 2012-10-12
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      相关资源
      最近更新 更多