Подтвердить что ты не робот

Arm-linux-androideabi-gcc не может создать исполняемый файл - компиляция ffmpeg для устройств android armeabi

Я пытаюсь скомпилировать ffmpeg для устройств android armeabi.

Я следую руководству roman10.net
Его сборка script строит ffmpeg для устройств armv7-a. Я хочу построить его для армейцев.

Моя конечная цель - запустить команды ffmpeg на устройствах android armeabi и armv7-a.

Итак, я изменяю часть процессора script с

#arm v7vfpv3
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one 

к

#arm v6
CPU=armv6
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG=
build_one

(Я думал, что сменить его на armv6 построит ffmpeg, совместимый с устройствами armeabi. m я не так?)

Сомнение 1:
Должен ли я также менять инструментальную цепочку?
от arm-linux-androideabi-4.4.3 до arm-eabi-4.4.0

Сомнение 2:

Когда я пытаюсь запустить. /build.sh(без изменения инструментальной цепочки), он вызывает следующую ошибку:

/home/chaitanya/android/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc is unable to create an executable file.
C compiler test failed.

If you think configure made a mistake,.. blaah blahh blaah

после этого у меня появилось много предупреждений, говорящих:
'Sub_id устарела, а многие другие функции не поддерживают предупреждения.

платформа: ubuntu 11.10
версия ffmpeg: 0.11.2
NDK: android-ndk-r5b

Вот моя сборка script:

#!/bin/bash
######################################################
# Usage:
# put this script in top of FFmpeg source tree
# ./build_android
# It generates binary for following architectures:
# ARMv6 
# ARMv6+VFP 
# ARMv7+VFPv3-d16 (Tegra2) 
# ARMv7+Neon (Cortex-A8)
# Customizing:
# 1. Feel free to change ./configure parameters for more features
# 2. To adapt other ARM variants
# set $CPU and $OPTIMIZE_CFLAGS 
# call build_one
######################################################
NDK=~/android/android-ndk-r5b
PLATFORM=$NDK/platforms/android-8/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
function build_one
{
./configure --target-os=linux \
    --prefix=$PREFIX \
    --enable-cross-compile \
    --extra-libs="-lgcc" \
    --arch=arm \
    #--cc=$PREBUILT/bin/arm-linux-androideabi-gcc \
    --cross-prefix=$PREBUILT/bin/arm-linux-androideabi- \
    #--nm=$PREBUILT/bin/arm-linux-androideabi-nm \
    --sysroot=$PLATFORM \
    --extra-cflags=" -O3 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
    --disable-shared \
    --enable-static \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
    --disable-everything \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --disable-ffplay \
    --enable-protocol=file \
    --enable-avformat \
    --enable-avcodec \
    --enable-decoder=rawvideo \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-parser=h264 \
    --disable-network \
    --enable-zlib \
    --disable-avfilter \
    --disable-avdevice \
    $ADDITIONAL_CONFIGURE_FLAG

make clean
make  -j4 install
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o
$PREBUILT/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}

#arm v6
CPU=armv6
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG=
build_one

#arm v7vfpv3
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfp
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
#PREFIX=./android/$CPU-vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

Как мне решить эту проблему? что не так?

4b9b3361

Ответ 1

Я не уверен, что это то, что вы ищете, но я создал script для создания FFmpeg 0.11.1 для Android. Я изменил скрипты, созданные старыми сборками Bambuser FFmpeg, чтобы заставить их работать с 0.11.1. В настоящее время я использую этот script для сборки FFmpeg в моем собственном приложении, поэтому я знаю, что сборка работает. script находится в http://servestream.sourceforge.net/build-ffmpeg.sh. Я использую android-ndk-r8b и Ubuntu 12.04 (x64) для создания здания. Чтобы использовать script, выполните следующие действия:

1.) Загрузите script
2.) Откройте script и измените переменную PACKAGE в соответствии с пакетом приложений
3.) Сделайте его исполняемым: chmod + x build-ffmpeg.sh
4.) Установите переменную NDK, используемую script, например: export NDK =/home/user/android-ndk-r8b
5.) Запустите script:./build-ffmpeg.sh

Скомпилированные двоичные файлы будут расположены во вновь созданной папке "final-builds" в текущем рабочем каталоге. (Примечание: script строит двоичные файлы для архитектур armeabi, armeabi-v7a и x86)

Надеюсь, это ответит на ваш вопрос.

UPDATE:

Если script не найден, http://sourceforge.net/p/servestream/code/HEAD/tree/ffmpeg/scripts/arm-build.sh

Ответ 2

Наконец-то я обнаружил проблему с моей установкой, столкнувшись с этой проблемой... Посмотрев на arm-build.sh script, я начал следовать за script. Обратите внимание на путь "TOOLCHAIN ​​=...".

Первоначально путь был: ToolChain = echo $NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/*-x86

Когда я пошел проверять этот путь, я заметил, что это не так. Я думаю, причина в том, что у меня есть 64-разрядная сборка.

Мой путь на самом деле: .../компилированные инструменты/рычажного линукс-androideabi-4,6/прекомпилированное/Linux-x86_64

То, что я закончил, это копирование папки и переименование ее на "linux-x86", и теперь все компилируется.

Надеюсь, это поможет кому-то!

Ответ 3

У меня была аналогичная ошибка (сбой C-компилятора) при попытке построить ffmpeg с использованием версии r8d ndk, а также r8b.

Проблема, о которой я позже узнал, заключалась в том, что опция "Извлечь здесь" на последней версии ubuntu, похоже, имеет некоторую ошибку. Он не извлекает все. Таким образом, используя "tar -jxf" извлекает правильно, и вы увидите больше исполняемых файлов в папке bin.

Вы можете проверить это для справки. http://code.google.com/p/android/issues/detail?id=41187

Ответ 4

В моем случае я пытался создать расширение exoplayer ffmpeg. Он не может собираться с текущими версиями NDK (gcc был удален в NDK 18b), поэтому вы должны вернуться к NDK 15c.

Смотрите здесь: https://github.com/google/ExoPlayer/issues/4940