Скомпилировать FFMPEG + x264 - неопределенные ссылки

Я пытался найти решение в Интернете в течение нескольких дней, но безуспешно. Я использую Ubuntu и пытаюсь скомпилировать последнюю стабильную версию FFMPEG (1.0.1) с поддержкой x264. Я убедился, что удалил все существующие x264, затем скачал последний исходный код x264 и скомпилировал его со следующей конфигурацией:

./configure --prefix=$PREFIX \
    --enable-shared \
    --enable-static \
    --disable-gpac \
    --extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fno-short-enums -D__ARM_ARCH
libavcodec/libavcodec.a(libx264.o): In function `X264_frame':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:159: undefined reference to `x264_picture_init'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:179: undefined reference to `x264_encoder_reconfig'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:190: undefined reference to `x264_encoder_encode'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:196: undefined reference to `x264_encoder_delayed_frames'
libavcodec/libavcodec.a(libx264.o): In function `encode_nals':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:101: undefined reference to `x264_bit_depth'
libavcodec/libavcodec.a(libx264.o): In function `X264_close':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:231: undefined reference to `x264_encoder_close'
libavcodec/libavcodec.a(libx264.o): In function `X264_init':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:284: undefined reference to `x264_param_default'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:292: undefined reference to `x264_param_default_preset'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:314: undefined reference to `x264_param_parse'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:459: undefined reference to `x264_param_apply_fastfirstpass'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:490: undefined reference to `x264_param_apply_profile'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:533: undefined reference to `x264_encoder_open_129'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:544: undefined reference to `x264_encoder_headers'
_ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP " \ --extra-ldflags=" -nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,nocopyreloc -Wl,-soname,/usr/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -lc -lm -ldl -lgcc" \ --cross-prefix=${ARM_PRE}- \ --disable-asm \ --host=arm-linux \ make clean make install

Все идет хорошо, и я проверил установленную версию:

x264 -V
    x264 0.129.x
    built on Dec 27 2012, gcc: 4.6.1
    configuration: --bit-depth=8 --chroma-format=all
    x264 license: GPL version 2 or later

Затем я пытаюсь скомпилировать FFMPEG со следующими параметрами:

./configure --target-os=linux \
    --enable-libx264 \
    --enable-gpl \
    --prefix=$PREFIX \
    --extra-cflags="-I/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/android/armv7-a/include -I/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/x264 -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 " \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/android/armv7-a/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
    --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 \

Настройка и make clean/make install работают хорошо, но когда я пытаюсь создать файл .so, происходит сбой следующей команды:

/home/tishu/Apps/android-ndk-r8d/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld 
    -rpath-link=./android/armv7-a/usr/lib -L/home/tishu/Apps/android-ndk-r8d/platforms/android-14/arch-arm/usr/lib -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic \
    --whole-archive --no-undefined -o ./android/armv7-a/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 /home/tishu/Apps/android-ndk-r8d/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a

Это не удается со следующим выводом:

libavcodec/libavcodec.a(libx264.o): In function `X264_frame':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:159: undefined reference to `x264_picture_init'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:179: undefined reference to `x264_encoder_reconfig'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:190: undefined reference to `x264_encoder_encode'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:196: undefined reference to `x264_encoder_delayed_frames'
libavcodec/libavcodec.a(libx264.o): In function `encode_nals':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:101: undefined reference to `x264_bit_depth'
libavcodec/libavcodec.a(libx264.o): In function `X264_close':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:231: undefined reference to `x264_encoder_close'
libavcodec/libavcodec.a(libx264.o): In function `X264_init':
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:284: undefined reference to `x264_param_default'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:292: undefined reference to `x264_param_default_preset'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:314: undefined reference to `x264_param_parse'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:459: undefined reference to `x264_param_apply_fastfirstpass'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:490: undefined reference to `x264_param_apply_profile'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:533: undefined reference to `x264_encoder_open_129'
/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/ffmpeg-1.0.1/libavcodec/libx264.c:544: undefined reference to `x264_encoder_headers'

Версия x264, которую он ищет (129), установлена ​​и успешно скомпилирована с --eanable-shared. Очевидно, что все компилируется нормально, если я не включаю libx64.

Вопрос. Как указать путь включения для последней команды? Я попытался добавить путь к $PATH, а также добавить это в качестве аргумента, но безуспешно: -I/home/tishu/Workspaces/ffmpeg/ffmpeg/jni/x264

Спасибо


person tishu    schedule 29.12.2012    source источник
comment
Еще немного информации о том, как работает ld: network-theory.co .uk/docs/gccintro/gccintro_95.html — я только что добавил libx64.a в список файлов для ссылки, и теперь он работает   -  person tishu    schedule 29.12.2012
comment
Сообщения undefined reference могут указывать на то, что у вас могут быть установлены две разные версии x264 одновременно.   -  person llogan    schedule 29.12.2012
comment
Если вы правильно соберете x264 для ARM, вы не сможете запустить его, чтобы получить вторую экспозицию. Либо вы не смогли удалить версию x86, либо пересобрали ее. В любом случае, вы, вероятно, можете исправить свою сборку ffmpeg, просто добавив /home/tishu/Workspaces/ffmpeg/ffmpeg/jni/x264/libx264.so к --extra-ldflags=   -  person Alex Cohn    schedule 31.12.2012
comment
Привет, Тишу :) Я пытаюсь воспроизвести файл .ts из приложения для Android. Для этого я использовал библиотеку FFmpeg из github. com/appunite/AndroidFFmpeg. Мне удалось скомпилировать и успешно запустить пример приложения. Но приложение не воспроизводит файлы .ts. Не могли бы вы подсказать мне, что мне делать, чтобы воспроизвести файл .ts. Спасибо   -  person Arun Badole    schedule 31.12.2012


Ответы (1)


Для подписчиков (даже не андроид, но похожее сообщение),

/.../mingw-w64-i686/lib/gcc/.../i686-w64-mingw32/bin/ld: 
libavcodec/libavcodec.a(libx264.o):libx264.c:(.text+0x3c): 
undefined reference to `x264_bit_depth'
: undefined reference to `x264_encoder_open_152'

похоже, эта константа была «удалена» в начале 2017 года, см. https://trac.ffmpeg.org/ticket/6966 и https://trac.ffmpeg.org/ticket/6932

исправить: обновить ffmpeg или обновить libx264... или еще что-то...

хотя в наши дни предполагается, что он поддерживает и более старую версию libx264...

person rogerdpack    schedule 06.02.2019