Я нахожусь в процессе обновления версии моего приложения 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?
Кто-нибудь знает, в чем может быть проблема, или где я могу начать искать?