Undefined Reference - ffmpeg在android ndk上。

时间:2021-12-28 05:33:38

I´ve spent many hours trying to figure out why I still get "undefined reference" when trying to link to ffmpeg. I´ve already read most if not all posts and sites about the subject, so I think I´m missing something little here and I hope you can help me.

我花了很多时间试图找出为什么在尝试连接ffmpeg时,仍然会有“未定义的引用”。我´已经读大多数(如果不是全部的话)文章和网站的主题,所以我认为我´丢失的东西很少,我希望你能帮助我。

What I have:

我有什么:

I´m using windows 7 + cygwin + crystax r4. I´ve compiled FFMPEG using RockPlayer's ffmpeg source plus some modifications I did (only to include / exclude demuxes, decoders, encoders, ...) After compiling, I get:

我使用windows 7 +´cygwin + crystax r4。我´ve FFMPEG编译使用RockPlayer FFMPEG源加我做一些修改(仅包含/排除多路分配器,解码器,编码器,…)编译后,得到:

  • a new folder named armv5te, which includes:
  • 一个名为armv5te的新文件夹,其中包括:
  • a folder named "include" with all folders for each libs' .h
  • 一个名为“包含”的文件夹包含每个libs' .h的所有文件夹。
  • a folder named "lib" which includes all libs' .a
  • 一个名为“lib”的文件夹,包含所有的libs。
  • a shared library named libffmpeg.so (checked soname and it is libffmpeg)
  • 一个名为libffmpeg的共享库。所以(勾选soname,它是libffmpeg)

The shared library isn´t also placed on project/lib/armeabi/libffmpeg.so

共享库也被放置在项目/lib/armeabi/libffmpeg.so中。

After compiling I tried to compile my project and link it. While my .cpp compiles ok, I get many undefined references.

编译后,我尝试编译我的项目并链接它。当我的.cpp编译好的时候,我得到了许多未定义的引用。

here is my build script:

这是我的构建脚本:

NDK=/cygdrive/c/Gabriel/Desenvolvimento/SDKs/Android/android-ndk-r4-crystax
PLATFORM=$NDK/build/platforms/android-8/arch-arm/
PREBUILT=$NDK/build/prebuilt/windows/arm-eabi-4.4.0


function build_one
{

./configure --target-os=linux \
    --prefix=$PREFIX \
    --enable-cross-compile \
    --extra-libs="-lgcc" \
    --arch=arm \
    --cc=$PREBUILT/bin/arm-eabi-gcc \
    --cross-prefix=$PREBUILT/bin/arm-eabi- \
    --nm=$PREBUILT/bin/arm-eabi-nm \
    --sysroot=$PLATFORM \
    --extra-cflags=" -O2 -fpic -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums  -fno-strict-aliasing -finline-limit=300 $OPTIMIZE_CFLAGS " \
    --disable-shared \
    --enable-static \
    --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -nostdlib -lc -lm -ldl -llog" \
    --disable-stripping \
    --disable-debug \
    --disable-symver \
    --disable-ffprobe \
    --disable-devices \
    --disable-avfilter \
    --disable-swscale \
    --disable-ffplay \
    --disable-ffserver \
    --disable-network \
        (many more ...)
    --enable-asm \
    $ADDITIONAL_CONFIGURE_FLAG

#make clean
make  -j4 install

$PREBUILT/bin/arm-eabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/bin/arm-eabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -soname libffmpeg.so -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a  -lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-eabi/4.4.0/libgcc.a

}

#arm v5
CPU=armv5te
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=./android/$CPU 
ADDITIONAL_CONFIGURE_FLAG=
build_one

Here is my android.mk:

这是我android.mk:

LOCAL_PATH := $(call my-dir)

#declare the prebuilt library
include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-prebuilt
LOCAL_SRC_FILES := $(LOCAL_PATH)/ffmpeg/android/armv5te/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/android/armv5te/include
LOCAL_PRELINK_MODULE := true 
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := audiocodec
LOCAL_SRC_FILES := ffmpeg_audio.cpp
LOCAL_SHARED_LIBRARY := libffmpeg
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg/android/armv5te/include
LOCAL_LDLIBS    := -llog -ljnigraphics -lz -lm $(LOCAL_PATH)/ffmpeg/android/armv5te/libffmpeg.so
include $(BUILD_SHARED_LIBRARY)

The result:

结果:

Compile++ thumb: audiocodec <= /cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFM
PEG/jni/ffmpeg_audio.cpp
SharedLibrary  : libaudiocodec.so
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/obj/local/armeabi/objs/audi
ocodec/ffmpeg_audio.o: In function `Java_gabriel_audioslower_pro_ffmpegDecoder_r
eadSamples':
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:172: u
ndefined reference to `avcodec_decode_audio3(AVCodecContext*, short*, int*, AVPa
cket*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:178: u
ndefined reference to `av_read_frame(AVFormatContext*, AVPacket*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/obj/local/armeabi/objs/audi
ocodec/ffmpeg_audio.o: In function `Java_gabriel_audioslower_pro_ffmpegDecoder_s
eekToPosMS':
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:147: u
ndefined reference to `av_rescale_q(long long, AVRational, AVRational)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:150: u
ndefined reference to `av_seek_frame(AVFormatContext*, int, long long, int)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:151: u
ndefined reference to `avcodec_flush_buffers(AVCodecContext*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:152: u
ndefined reference to `av_read_frame(AVFormatContext*, AVPacket*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/obj/local/armeabi/objs/audi
ocodec/ffmpeg_audio.o: In function `Java_gabriel_audioslower_pro_ffmpegDecoder_c
loseFile':
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:82: un
defined reference to `avcodec_close(AVCodecContext*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:83: un
defined reference to `av_free(void*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:84: un
defined reference to `av_close_input_file(AVFormatContext*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/obj/local/armeabi/objs/audi
ocodec/ffmpeg_audio.o: In function `Java_gabriel_audioslower_pro_ffmpegDecoder_o
penAudioFile':
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:37: un
defined reference to `av_open_input_file(AVFormatContext**, char const*, AVInput
Format*, int, AVFormatParameters*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:44: un
defined reference to `av_find_stream_info(AVFormatContext*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:52: un
defined reference to `avcodec_find_decoder(CodecID)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:60: un
defined reference to `avcodec_open(AVCodecContext*, AVCodec*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:67: un
defined reference to `av_malloc(unsigned int)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:70: un
defined reference to `av_read_frame(AVFormatContext*, AVPacket*)'
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/obj/local/armeabi/objs/audi
ocodec/ffmpeg_audio.o: In function `JNI_OnLoad':
/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/jni/ffmpeg_audio.cpp:25: un
defined reference to `av_register_all()'
collect2: ld returned 1 exit status
make: *** [/cygdrive/c/Gabriel/Desenvolvimento/Workspace/FFMPEG/obj/local/armeab
i/libaudiocodec.so] Error 1

Something interesting is that some functions from ffmpeg, as av_register_all(), do now show up on the list of undefined references.

有趣的是,ffmpeg中的一些函数,如av_register_all(),现在显示在未定义的引用列表中。

Any ideas on what I can do to fix it? I´ve spent 3 days trying to make things work .. Thanks!

我能做些什么来修复它?我´已经花了三天的时间试图使事情工作. .谢谢!

2 个解决方案

#1


5  

Try add

尝试添加

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

to your makefile.

你的makefile。

#2


3  

Maybe you forgot to wrap the ffmpeg headers as C:

也许你忘了把ffmpeg标头包装成C:

extern "C"
{
#include "avcodec.h"
}

#1


5  

Try add

尝试添加

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

to your makefile.

你的makefile。

#2


3  

Maybe you forgot to wrap the ffmpeg headers as C:

也许你忘了把ffmpeg标头包装成C:

extern "C"
{
#include "avcodec.h"
}