【问题标题】:Undefined reference error, can not create shared library未定义引用错误,无法创建共享库
【发布时间】:2015-02-15 15:21:04
【问题描述】:

尝试了很多方法来解决问题,但没有运气。这是我的 Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)  
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES :=libavcodec.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)   
LOCAL_MODULE := avutil
LOCAL_SRC_FILES :=libavutil.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS) 
LOCAL_MODULE := swscale
LOCAL_SRC_FILES :=libswscale.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)  
LOCAL_MODULE := avformat
LOCAL_SRC_FILES :=libavformat.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)   
LOCAL_MODULE := avresample
LOCAL_SRC_FILES :=libavresample.a
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)   
LOCAL_MODULE := swresample
LOCAL_SRC_FILES :=libswresample.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS) 
LOCAL_MODULE :=     x264
LOCAL_SRC_FILES :=libx264.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)  
#------------------------------------------
LOCAL_C_INCLUDES := $(LOCAL_PATH)\
$(LOCAL_PATH)/include

LOCAL_MODULE    := media

LOCAL_SRC_FILES := \
P_Decoding.cpp \
P_Encoding.cpp \
wrapper_for_ffmpeg.cpp

LOCAL_CPPFLAGS := -std=c++11 -pthread -frtti -fexceptions

LOCAL_ARM_MODE := arm 

LOCAL_STATIC_LIBRARIES := avcodec avutil swscale avformat avresample swresample x264

LOCAL_LDLIBS :=  -llog -ljnigraphics -landroid -lz -lEGL

LOCAL_CPP_FEATURES :=  rtti exceptions 

include $(BUILD_SHARED_LIBRARY)

在 jni 文件夹中,有所有与 makefile 上的 .cpp 文件相关的头 .hpp 文件,还有所有静态 .a 库和所有与静态库相关的头文件的“include”文件夹。我正在使用 ndk9c 版本。 这是错误日志的一部分:

[armeabi-v7a] Compile++ thumb: media <= P_Decoding.cpp
[armeabi-v7a] Compile++ thumb: media <= P_Encoding.cpp
[armeabi-v7a] Compile++ thumb: media <= wrapper_for_ffmpeg.cpp

/home/pro/android-ndk-r9c/toolchains/llvm-3.3/prebuilt/linux-x86/bin/clang++ -Wl,-soname,libmedia.so -shared --sysroot=/home/pro/android -ndk-r9c/platforms/android-9/arch-arm ./obj/local/armeabi/objs/media/P_Decoding.o ./obj/local/armeabi/objs/media/P_Encoding.o jni/libavformat.a jni /libavcodec.a jni/libavutil.a jni/libswscale.a -lgcc ./obj/local/armeabi/libgnustl_shared.so -gcc-toolchain /home/pro/android-ndk-r9c/toolchains/arm-linux-androideabi- 4.8/prebuilt/linux-x86 -no-canonical-prefixes -target armv5te-none-linux-androideabi -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,现在 -L/home/pro/android-ndk-r9c/platforms/android-9/arch-arm/usr/lib -llog -ljnigraphics -lz -ldl -lgcc /home/pro/android-ndk-r9c/sources/ cxx-stl/gnu-libstdc++/4.8/libs/armeabi/libsupc++.a -lc -lm -o ./obj/local/armeabi/libmedia.so

jni/P_Decoding.cpp:10: error: undefined reference to 'avcodec_register_all'
jni/P_Decoding.cpp:17: error: undefined reference to 'avcodec_find_decoder'
jni/P_Decoding.cpp:14: error: undefined reference to 'avcodec_find_decoder_by_name'
jni/P_Decoding.cpp:24: error: undefined reference to 'avcodec_alloc_context3'
jni/P_Decoding.cpp:50: error: undefined reference to 'avcodec_open2'
jni/P_Decoding.cpp:56: error: undefined reference to 'avcodec_alloc_frame'
jni/P_Decoding.cpp:76: error: undefined reference to 'sws_getContext'
jni/P_Decoding.cpp:90: error: undefined reference to 'avcodec_decode_video2'
jni/P_Decoding.cpp:104: error: undefined reference to 'sws_scale'
jni/P_Decoding.cpp:118: error: undefined reference to 'avcodec_close'

请帮忙。提前致谢

【问题讨论】:

    标签: android c++ android-ndk java-native-interface


    【解决方案1】:

    确保您在 libavcodec 和 swscale 标头的包含周围添加了 extern "C" 块,例如像这样:

    extern "C" {
    #include <libavcodec/avcodec.h>
    #include <libswscale/swscale.h>
    }
    

    请参阅 https://libav.org/faq.html#I_0027m-using-Libav-from-within-my-C_002b_002b-application-but-the-linker-complains-about-missing-symbols-which-seem-to-be-available_002e 了解相关说明。


    编辑:另外,您确定预构建的 libavcodec.a 与您正在构建的架构 (armeabi-v7a) 相同吗?如果您要为多种架构(armeabi-v7a、x86 等)构建共享库,您还需要有多个对应版本的预构建库。

    【讨论】:

    • 您确定在整个项目的每个位置都有该代码,其中包含任何 libavcodec/libavutil/libswscale 标头吗?
    • 是的。我只在我拥有的一个空间中使用
    • 您确定预构建的 libavcodec.a 与您正在构建的架构 (armeabi-v7a) 相同吗?如果您正在为多种架构(armeabi-v7a、x86 等)构建共享库,您还需要拥有多个相应版本的预构建库。
    • 哦,我不确定静态库是否具有相同的架构,这可能是问题的原因吗?我可以通过显示静态库和头文件来预构建相应的架构吗?
    • 如果缺少extern "C",则未解析的符号看起来会被破坏
    【解决方案2】:

    尝试ndk-build V=1 查看链接库的实际命令。你想以

    结束
    -lavformat -lavcodec -lavfilter -lavutil -lswscale
    

    按此顺序(如 here),但我不确定 avresample swresample x264 应该放在哪里。相应地重新排列您的 LOCAL_STATIC_LIBRARIES

    【讨论】:

    • 我添加了由 ndk-build V=1 获得的额外日志文件
    • jni/libavformat.a 和其他库是如何创建的?也许,正如@mstorsjo 建议的那样,它们不是为 armeabi 而构建的?
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多