ffmpeg ndk multiple definition libavcodec.a(golomb.o)

ffmpeg ndk multiple definition libavcodec.a(golomb.o)

本文关键字:golomb libavcodec ndk multiple definition ffmpeg      更新时间:2023-10-16

我正在尝试将 ffmpeg 作为静态库与 android NDK 链接,但我收到"多重定义"错误,如下所示。我还包含了我的构建脚本,它可以很好地运行所有内容,但是当我使用 Eclipse 中的库和 ADT 插件时,我无处可去。

由此看来,它想要与VLC有关。我不想与VLC有任何关系,只想与视频流的ffmpeg有关。共享库一切正常,但我追求的是一个非常小的播放器,因为我受限于设备上的空间。

编辑:"log2_tab_tab.o"也有多种定义。

error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_golomb_vlc_len'  Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_interleaved_dirac_golomb_vlc_code'   Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_interleaved_golomb_vlc_len'  Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_interleaved_se_golomb_vlc_code'  Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_interleaved_ue_golomb_vlc_code'  Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_se_golomb_vlc_code'  Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_ue_golomb_len'   Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(golomb.o): multiple definition of 'ff_ue_golomb_vlc_code'  Ffplayer            C/C++ Problem
error: jni/libslibavcodec.a(log2_tab.o): multiple definition of 'ff_log2_tab'  Ffplayer            C/C++ Problem
error: jni/libslibavformat.a(log2_tab.o): multiple definition of 'ff_log2_tab' Ffplayer            C/C++ Problem
jni/libslibavformat.a(golomb_tab.o): previous definition here  Ffplayer            C/C++ Problem
jni/libslibavutil.a(log2_tab.o): previous definition here  Ffplayer            C/C++ Problem
make.exe: *** [obj/local/armeabi-v7a-hard/libffplayer.so] Error 1   Ffplayer            C/C++ Problem
使用

ffmpeg (2.4.3) 的最新分支,我的 Android 构建脚本(使用工具链 8,因为它是我正在使用的旧硬件)并希望支持 NEON 硬件:

export ANDROID_NDK=/home/carl/dev/ndk
export TOOLCHAIN=/home/carl/temp/ffmpeg
export SYSROOT=$TOOLCHAIN/sysroot/
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh 
    --platform=android-8 --install-dir=$TOOLCHAIN
export PATH=$TOOLCHAIN/bin:$PATH
export CC=arm-linux-androideabi-gcc
export LD=arm-linux-androideabi-ld
export AR=arm-linux-androideabi-ar
CFLAGS="-O3 -Wall -mthumb -pipe -fpic -fasm 
  -finline-limit=300 -ffast-math 
  -fstrict-aliasing -Werror=strict-aliasing 
  -fmodulo-sched -fmodulo-sched-allow-regmoves 
  -Werror=implicit-function-declaration 
  -Wno-psabi -Wa,--noexecstack"
#  -D__ARM_ARCH_5__ -D__ARM_ARCH_5E__ 
#  -D__ARM_ARCH_5T__ -D__ARM_ARCH_5TE__ 
#  -DANDROID -DNDEBUG"
EXTRA_CFLAGS="-march=armv7-a -mfpu=neon 
              -mfloat-abi=softfp -mvectorize-with-neon-quad 
              -DHAVE_ISNAN -DHAVE_ISINF
              -std=c99"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
FFMPEG_FLAGS="--prefix=/home/dev/ffmpeg/build 
  --target-os=linux 
  --arch=arm 
  --enable-cross-compile 
  --cross-prefix=arm-linux-androideabi- 
  --enable-shared 
  --enable-static 
  --enable-small 
  --disable-symver 
  --disable-doc 
  --disable-ffplay 
  --disable-ffmpeg 
  --disable-ffprobe 
  --disable-ffserver 
  --disable-avdevice 
  --disable-avfilter 
  --disable-encoders  
  --disable-muxers 
  --disable-demuxers 
  --disable-filters 
  --disable-devices 
  --disable-decoders 
  --enable-decoder=mjpeg 
  --enable-decoder=mp1 
  --enable-decoder=mp2 
  --enable-decoder=mp3 
  --enable-decoder=mpeg1_vdpau 
  --enable-decoder=mpeg1video 
  --enable-decoder=mpeg2video 
  --enable-decoder=mpeg4 
  --enable-decoder=mpeg4_vdpau 
  --enable-decoder=mpegvideo 
  --enable-decoder=mpeg_xvmc 
  --enable-decoder=h261 
  --enable-decoder=h263 
  --enable-decoder=h263i 
  --enable-decoder=h263p 
  --enable-hwaccel=h263_vaapi 
  --enable-hwaccel=h263_vdpau 
  --enable-hwaccel=mpeg1_vdpau 
  --enable-hwaccel=mpeg1_xvmc 
  --enable-hwaccel=mpeg2_dxva2 
  --enable-hwaccel=mpeg2_vaapi 
  --enable-hwaccel=mpeg2_vdpau 
  --enable-hwaccel=mpeg2_xvmc 
  --enable-hwaccel=mpeg4_vaapi 
  --enable-hwaccel=mpeg4_vdpau 
  --enable-demuxer=aac 
  --enable-demuxer=ac3 
  --enable-demuxer=h261 
  --enable-demuxer=h263 
  --enable-demuxer=pcm_s16be 
  --enable-demuxer=pcm_s16le 
  --enable-demuxer=pcm_s8 
  --enable-demuxer=mpegps 
  --enable-demuxer=mpegts 
  --enable-demuxer=mpegtsraw 
  --enable-demuxer=mpegvideo 
  --enable-demuxer=rtp 
  --enable-demuxer=rtsp 
  --enable-parser=aac 
  --enable-parser=mpegvideo 
  --enable-parser=ac3 
  --enable-parser=h261 
  --enable-parser=h263 
  --enable-parser=mjpeg 
  --enable-parser=mpeg4video 
  --enable-parser=mpegaudio 
  --enable-protocol=rtp 
  --enable-protocol=file 
  --enable-protocol=ftp 
  --enable-protocol=tcp 
  --enable-protocol=http 
  --enable-protocol=udp 
  --enable-protocol=pipe 
  --enable-protocol=unix 
  --enable-network 
  --disable-swscale  
  --enable-asm 
  --enable-memalign-hack 
  --disable-golomb 
  --enable-stripping 
  --enable-pthreads 
  --disable-symver 
  --enable-version3"
./configure $FFMPEG_FLAGS --extra-cflags="$CFLAGS $EXTRA_CFLAGS" 
  --extra-ldflags="$EXTRA_LDFLAGS"
make clean
echo "Project now cleaned"
make -j4
echo "Stripping multiple references from libraries"
arm-linux-androideabi-ar d libavcodec.a log2_tab.o
arm-linux-androideabi-ar d libavutil.a log2_tab.o
echo "Done..."

这是 Android.mk 工作正常的文件。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := avutil
LOCAL_SRC_FILES := libslibavutil.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := avformat
LOCAL_SRC_FILES := libslibavformat.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := avcodec
LOCAL_SRC_FILES := libslibavcodec.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE    := ffplayer
LOCAL_SRC_FILES := ffplayer.cpp
LOCAL_C_INCLUDES := C:DEVffmpeg
LOCAL_LDLIBS    += -llog -ljnigraphics -lGLESv2 -ldl
LOCAL_LDLIBS    += -lstdc++ -lc
LOCAL_LDLIBS    += -lz -lm
LOCAL_WHOLE_STATIC_LIBRARIES += libavutil libavformat libavcodec
include $(BUILD_SHARED_LIBRARY)

如果有人能发现这有什么问题,我们将不胜感激。

我通过使用

其他人使用的类似构建方法弄清楚了它,只是添加了我自己的选项。这个还复制文件夹"bin","lib","include"和"share"。然后我所需要的只是将"lib"和"include"文件夹添加到我的项目中。唷!

#!/bin/bash
NDK=/home/carl/dev/ndk
PLATFORM=$NDK/platforms/android-9/arch-arm
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86/
PREFIX=/home/carl/temp/ffmpeg/
function build_one
{
./configure --target-os=linux --prefix=$PREFIX 
--enable-cross-compile 
--enable-runtime-cpudetect 
--enable-asm 
--arch=arm 
--cc=$PREBUILT/bin/arm-linux-androideabi-gcc 
--cross-prefix=$PREBUILT/bin/arm-linux-androideabi- 
--disable-stripping 
--nm=$PREBUILT/bin/arm-linux-androideabi-nm 
--sysroot=$PLATFORM 
--enable-nonfree 
--enable-small 
--disable-symver 
--disable-doc 
--disable-ffplay 
--disable-ffmpeg 
--disable-ffprobe 
--disable-ffserver 
--disable-avdevice 
--disable-avfilter 
--disable-encoders  
--disable-muxers 
--disable-demuxers 
--disable-filters 
--disable-devices 
--disable-decoders 
--enable-decoder=mjpeg 
--enable-decoder=mp1 
--enable-decoder=mp2 
--enable-decoder=mp3 
--enable-decoder=mpeg1_vdpau 
--enable-decoder=mpeg1video 
--enable-decoder=mpeg2video 
--enable-decoder=mpeg4 
--enable-decoder=mpeg4_vdpau 
--enable-decoder=mpegvideo 
--enable-decoder=mpeg_xvmc 
--enable-decoder=h261 
--enable-decoder=h263 
--enable-decoder=h263i 
--enable-decoder=h263p 
--enable-hwaccel=h263_vaapi 
--enable-hwaccel=h263_vdpau 
--enable-hwaccel=mpeg1_vdpau 
--enable-hwaccel=mpeg1_xvmc 
--enable-hwaccel=mpeg2_dxva2 
--enable-hwaccel=mpeg2_vaapi 
--enable-hwaccel=mpeg2_vdpau 
--enable-hwaccel=mpeg2_xvmc 
--enable-hwaccel=mpeg4_vaapi 
--enable-hwaccel=mpeg4_vdpau 
--enable-demuxer=aac 
--enable-demuxer=ac3 
--enable-demuxer=h261 
--enable-demuxer=h263 
--enable-demuxer=pcm_s16be 
--enable-demuxer=pcm_s16le 
--enable-demuxer=pcm_s8 
--enable-demuxer=mpegps 
--enable-demuxer=mpegts 
--enable-demuxer=mpegtsraw 
--enable-demuxer=mpegvideo 
--enable-demuxer=rtp 
--enable-demuxer=rtsp 
--enable-parser=aac 
--enable-parser=mpegvideo 
--enable-parser=ac3 
--enable-parser=h261 
--enable-parser=h263 
--enable-parser=mjpeg 
--enable-parser=mpeg4video 
--enable-parser=mpegaudio 
--enable-protocol=rtp 
--enable-protocol=file 
--enable-protocol=ftp 
--enable-protocol=tcp 
--enable-protocol=http 
--enable-protocol=udp 
--enable-protocol=pipe 
--enable-protocol=unix 
--enable-network 
--disable-swscale  
--enable-asm 
--enable-memalign-hack 
--enable-stripping 
--enable-pthreads 
--disable-symver 
--enable-version3 
--extra-cflags="-I/home/android-ffmpeg/include -fPIC -DANDROID 
-D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated 
-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a" 
--extra-ldflags="-L/home/android-ffmpeg/lib"
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 -L$PREFIX/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libavresample/libavresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog -lx264 --warn-once --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
}
build_one