Недопустимый символ, связывающий FFmpeg 3.4.2, созданный с помощью NDK r16.

Я нахожусь в процессе обновления версии моего приложения FFmpeg с 2.8.6 до 3.4.2. Мне удалось собрать FFmpeg, но когда я создаю свою собственную библиотеку, я получаю сообщение об ошибке компоновщика:

  /usr/local/android-sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: /shared/dev/libs/ffmpeg/3.4.2/lib/android-x86/libswresample.so:1:1: invalid character
  /usr/local/android-sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: /shared/dev/libs/ffmpeg/3.4.2/lib/android-x86/libavcodec.so:1:1: invalid character
  /usr/local/android-sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: /shared/dev/libs/ffmpeg/3.4.2/lib/android-x86/libavfilter.so:1:1: invalid character
  /usr/local/android-sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/darwin-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin/ld: error: /shared/dev/libs/ffmpeg/3.4.2/lib/android-x86/libavutil.so:1:1: invalid character

Библиотеки правильные, но я не понимаю, откуда берется :1:1: (при условии, что конечный :, вероятно, является разделителем между командой и сообщением об ошибке). Путь к библиотеке правильный, но имя файла определенно не содержит :1:1.

Я строю на Mac, поэтому первое, что я делаю, это:

sed -i ".orig" "s/SHFLAGS='-shared -Wl,-soname,\$(SLIBNAME)'/SHFLAGS='-shared -Wl,-install_name,\$(SLIBNAME)'/g" configure

так что ld использует флаг -install_name, а не -soname. Раньше мне приходилось делать некоторые другие configure манипуляции, чтобы убрать имя библиотеки, но это больше не нужно (даже если я это сделаю, я все равно получаю ту же ошибку).

FFmpeg был собран с использованием следующих опций:

./configure --prefix=output --enable-shared --disable-everything 
    --disable-iconv --disable-zlib --disable-bzlib 
    --enable-encoder=aac --enable-decoder=aac --enable-encoder=pcm_alaw 
    --enable-decoder=pcm_alaw --enable-encoder=pcm_mulaw
    --enable-decoder=pcm_mulaw --enable-encoder=adpcm_g726
    --enable-decoder=adpcm_g726 --enable-encoder=adpcm_ima_wav
    --enable-decoder=adpcm_ima_wav --enable-encoder=mjpeg
    --enable-decoder=mjpeg --enable-encoder=wmav1
    --enable-decoder=wmav1 --enable-encoder=wmav2
    --enable-decoder=wmav2 --enable-encoder=wmv1 --enable-decoder=wmv1 
    --enable-encoder=wmv2 --enable-decoder=wmv2 
    --enable-encoder=h264_vaapi --enable-encoder=hevc_vaapi 
    --enable-encoder=h264_nvenc --enable-encoder=hevc_nvenc 
    --enable-encoder=h264_omx --enable-encoder=h264_qsv 
    --enable-encoder=hevc_qsv --enable-decoder=aac_fixed 
    --enable-decoder=aac_latm --enable-decoder=adpcm_g726le 
    --enable-decoder=h263 --enable-decoder=h264 --enable-decoder=hevc 
    --enable-decoder=mjpegb --enable-decoder=mpeg4 
    --enable-decoder=h264_qsv --enable-decoder=h264_vdpau 
    --enable-decoder=hevc_qsv --enable-decoder=hevc_qsv 
    --enable-filter=scale --enable-filter=scale_vaapi 
    --enable-filter=scale_cuda --enable-filter=scale_npp
    --enable-filter=scale_qsv --enable-parser=aac --enable-parser=h263
    --enable-parser=h264 --enable-parser=hevc --enable-parser=mjpeg
    --enable-muxer=asf --enable-demuxer=asf --enable-muxer=avi
    --enable-demuxer=avi --enable-muxer=h263 --enable-demuxer=h263
    --enable-muxer=h264 --enable-demuxer=h264 --enable-muxer=hevc
    --enable-demuxer=hevc --enable-muxer=mjpeg --enable-demuxer=mjpeg
    --enable-muxer=pcm_alaw --enable-demuxer=pcm_alaw 
    --enable-muxer=pcm_mulaw --enable-demuxer=pcm_mulaw --enable-muxer=wav
    --enable-demuxer=wav --enable-demuxer=aac --enable-hwaccel=h264_d3d11va
    --enable-hwaccel=hevc_d3d11va --enable-hwaccel=h264_d3d11va2 
    --enable-hwaccel=hevc_d3d11va2 --enable-hwaccel=h264_dxva2 
    --enable-hwaccel=hevc_dxva2 --enable-hwaccel=h264_vaapi
    --enable-hwaccel=hevc_vaapi --enable-hwaccel=h264_vdpau 
    --enable-hwaccel=hevc_vdpau --enable-hwaccel=h264_nvenc
    --enable-hwaccel=hevc_nvenc --enable-hwaccel=h264_qsv
    --enable-hwaccel=hevc_qsv --enable-hwaccel=h264_vdpau
    --enable-hwaccel=hevc_vdpau --disable-programs --enable-cross-compile
    --cross-prefix=/shared/dev/toolchain/android/darwin-x86_64/ndk-r16/android-19/arm/bin/arm-linux-androideabi-
    --arch=arm --target-os=android --disable-asm --disable-stripping
    --disable-static --cc=clang --enable-pic

Набор инструментов NDK — это автономный набор инструментов x86, созданный с использованием инструмента make_standalone_toolchain.py NDK r16.

Собственный проект создается с использованием CMake и набора инструментов clang для Android.

У меня также есть версия для рук, которая дает ту же ошибку компоновщика.

Я не уверен, где именно начать искать. Это произошло из параметров конфигурации сборки? Мне пришлось немного подправить, чтобы собрать его с помощью NDK r16, но в основном это были такие вещи, как добавление --disable-stripping и изменение --target-os с linux на android. Это что-то с набором инструментов NDK r16?

Кто-нибудь знает, в чем может быть проблема, или где я могу начать искать?


person Jordan    schedule 03.04.2018    source источник


Ответы (1)


Хорошо, я понял это.

Оказывается, передача --cc=clang настроит make-файлы на использование системного clang, не clang, доступного в предоставленном --cross-prefix. В результате был создан двоичный файл для архитектуры Darwin-x86_64, а НЕ для архитектур Android x86 или Android ARM.

Исправление заключалось в том, чтобы передать компилятору clang полный путь с параметром конфигурации --cc.

Я сделал свой скрипт сборки доступным на GitHub для всех, у кого возникли проблемы со сборкой FFmpeg для Android с использованием NDK r16b:

android-ffmpeg-buildscript

person Jordan    schedule 04.04.2018