未定义的引用错误,无法创建共享库。

4

尝试了很多方法来解决问题,但都没有成功。这是我的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++ 命令用来编译 C++ 代码,生成库文件 libmedia.so。其中 -Wl,-soname 表示指定动态库的 soname,-shared 表示生成共享库,--sysroot 指定系统根目录。代码文件路径为 ./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,在编译的时候需要使用到的动态库文件包括 ./obj/local/armeabi/libgnustl_shared.so、liblog.so、libjnigraphics.so 和 libz.so。命令中还包括其他参数,如 -gcc-toolchain、-no-canonical-prefixes、-target 等。最终生成的库文件路径是 ./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'

请帮忙。先提前致谢。
2个回答

3

请确保在包含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头文件的地方,都有正确的代码吗? - mstorsjo
是的,我只在一个空间中使用。 - support_ms
2
你确定预编译的libavcodec.a是与你正在构建的相同架构(armeabi-v7a)吗?如果你正在为多个架构(armeabi-v7a、x86等)构建共享库,那么你也需要有多个相应版本的预编译库。 - mstorsjo
如果缺少了 extern "C",那么未解析的符号看起来会很混乱。 - Alex Cohn
我为armeabi-v7a架构编译了静态库,问题解决了。@mstorsjo 谢谢您的建议。您可以更改您的答案,我会接受它。 - support_ms
显示剩余3条评论

0
尝试使用ndk-build V = 1命令查看链接库的实际命令。您希望最终得到以下结果:

-lavformat -lavcodec -lavfilter -lavutil -lswscale

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


我添加了额外的日志文件,这些文件是通过 ndk-build V=1 获取的。 - support_ms
jni/libavformat.a 和其他库是如何创建的?也许,正如 @mstorsjo 建议的那样,它们没有为 armeabi 构建? - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接