ffmpeg ndk multiple definition libavcodec.a(golomb.o)
ffmpeg ndk multiple definition libavcodec.a(golomb.o)
我正在尝试将 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
相关文章:
- 与 libavcodec 链接,仍然看到未定义的引用
- Libavcodec "the procedure entry point for av_frame_alloc could not be located" Visual Studio 2017 C+
- 在 Cmake 中链接 libavcodec,find_library不适用于任何库
- 将 SSE 指令与 Libavcodec 一起使用
- 如何预先分配LibavCodec的内存来编写解码的帧数据
- 如何使用libavcodec找到和解码n帧
- libavcodec/libx264 不产生 B 帧
- 由 libavcodec 返回的损坏的 AVFrame
- ffmpeg ndk multiple definition libavcodec.a(golomb.o)
- 如何在 Linux 中从源代码安装 libavcodec 和 libavutil
- ffmpeg(libavcodec).avcodec_encode_video内存泄漏
- 使用libavcodec解码音频,并使用libAO播放
- 使用libavcodec播放媒体时出现分段故障
- 如何在libavcodec中设置解码像素格式
- Libavcodec with audio
- 找出由libavcodec/h264解码的帧中的工件级别
- libavcodec.so的星号模块app_transcoder失败(未定义的符号avacodec_init)
- libavcodec视频解码不起作用