链接FFmpeg 3.4.2与NDK r16构建的字符无效

时间:2018-04-03 23:12:07

标签: android android-ndk android-ffmpeg

我正在将我的应用程序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工具链是使用NDK r16的make_standalone_toolchain.py工具构建的独立x86工具链。

本机项目是使用CMake并使用clang android工具链构建的。

我还有一个arm版本,它会产生相同的链接器错误。

我不确定从哪里开始寻找。这是来自构建配置选项吗?我不得不进行相当多的调整以使用NDK r16进行构建,但主要是添加--disable-stripping并将--target-oslinux更改为android。它与NDK r16工具链有关吗?

有谁知道问题可能是什么,或者我可能会从哪里开始寻找?

1 个答案:

答案 0 :(得分:1)

好的,我想出来了。

事实证明,传递--cc=clang会将makefile配置为使用系统 clang,而不是提供的--cross-prefix中可用的clang。这导致了为Darwin-x86_64架构构建的二进制文件,以及 NOT Android x86或Android ARM架构。

修复是使用--cc配置选项将完整路径传递给clang编译器。

我已经在GitHub上为任何使用NDK r16b构建FFmpeg for Android的人提供了我的构建脚本:

android-ffmpeg-buildscript