2011-10-16 28 views
2

我花了很多時間試圖找出爲什麼我仍然得到「未定義的參考」,當試圖鏈接到ffmpeg。 我已經閱讀了大部分,如果不是所有關於這個主題的帖子和網站,所以我想我在這裏錯過了一些小東西,我希望你能幫助我。未定義的參考 - Android上的ffmpeg ndk

我有什麼:

I'm使用Windows 7 + cygwin的+ crystax R4。使用RockPlayer的的ffmpeg的源加上一些修改,我做了 從來就編譯FFMPEG(僅包含/排除多路解複用器,解碼器,編碼器,...) 編譯後,我得到:

  • 命名的ARMv5TE新的文件夾,其中包括:
  • 一個文件夾名爲「包括」具有用於所有文件夾的每個庫.H
  • 一個名爲‘LIB’,其包括所有的庫文件夾.A
  • 命名libffmpeg.so(選中的soname共享庫它是libffmpeg)

共享庫isn't也放在項目的/ lib目錄/ armeabi/libffmpeg.so

編譯我試圖編譯我的項目,並將其鏈接之後。雖然我的.cpp編譯好,但我得到了很多未定義的引用。

這裏是我的構建腳本:

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 

這裏是我的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) 

結果:

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 

一些有趣的是,從ffmpeg的一些功能,作爲av_register_all(),現在顯示在未定義的引用列表中。

關於我能做些什麼來解決它的任何想法?我花了3天的時間試圖讓事情發揮作用.. 謝謝!

回答

5

嘗試添加

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true 

到你的makefile。

+0

爲什麼這個錯誤,請進來,讓我知道? –

3

也許你忘了包ffmpeg的標題爲C:

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

謝謝,你的帖子救了我!我非常確定所有庫都是從輸出提供給鏈接器的,並且包含路徑設置正確,所以我在智慧的最後。 – TastyCatFood