【问题标题】:Android NDK - Including prebuilt static libraries gives undefined reference errorsAndroid NDK - 包括预建的静态库会导致未定义的引用错误
【发布时间】:2015-06-10 15:01:59
【问题描述】:

我正在尝试使用预构建的静态库构建共享库。出于某种原因,构建总是失败并给出undefined reference 错误。如果我添加LOCAL_ALLOW_UNDEFINED_SYMBOLS := true,则构建成功,但共享库只有几千字节,而静态库约为 3 兆字节......所以链接静态库似乎出了点问题。我不知道它可能是什么。我只使用 C++ 代码。

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := kes
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := libkes.a

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := PortaKES
LOCAL_SRC_FILES := PortaKES.cpp
LOCAL_STATIC_LIBARIES := kes

include $(BUILD_SHARED_LIBRARY)

Application.mk:

APP_ABI := all
APP_STL := stlport_static

JNI目录结构:

输出:

./obj/local/arm64-v8a/objs/PortaKES/PortaKES.o: In function `Java_com_kurzweil_portakes_KESFile_createPOLEFile':
C:\Users\niels.mylle\Documents\Kurzweil Mobile Android\PortaKES/jni/PortaKES.cpp:18: undefined reference to `CPoleFile::CPoleFile(char const*, bool, bool, CEncrypter*)'
./obj/local/arm64-v8a/objs/PortaKES/PortaKES.o: In function `Java_com_kurzweil_portakes_KESFile_createKSection':
C:\Users\niels.mylle\Documents\Kurzweil Mobile Android\PortaKES/jni/PortaKES.cpp:33: undefined reference to `CKSection::CKSection(char const*, CPoleFile*, CPoleLeaf*)'
./obj/local/arm64-v8a/objs/PortaKES/PortaKES.o: In function `Java_com_kurzweil_portakes_POLEFile_destroy':
C:\Users\niels.mylle\Documents\Kurzweil Mobile Android\PortaKES/jni/PortaKES.cpp:48: undefined reference to `CPoleFile::~CPoleFile()'
./obj/local/arm64-v8a/objs/PortaKES/PortaKES.o: In function `Java_com_kurzweil_portakes_POLEFile_exists':
C:\Users\niels.mylle\Documents\Kurzweil Mobile Android\PortaKES/jni/PortaKES.cpp:100: undefined reference to `CPoleFile::exists(char const*)'
collect2.exe: error: ld returned 1 exit status
make.exe: *** [obj/local/arm64-v8a/libPortaKES.so] Error 1

【问题讨论】:

    标签: makefile android-ndk shared-libraries static-libraries


    【解决方案1】:

    也许这只是问题的一部分,但至少这个引用是错误的:

    LOCAL_SRC_FILES := libkes.a
    

    您正在为所有与 ndk 兼容的架构进行构建,但始终为每个架构引用相同的静态预构建,这是行不通的。

    您应该为每个目标架构使用不同的 .a,即 ./armeabi/libkes.a./x86/libkes.a./armeabi-v7a/libkes.a 等。在这种情况下,您可以使用 TARGET_ARCH_ABI 引用您的 .a变量,像这样:

    LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libkes.a
    

    【讨论】:

    • 好吧,经过一番努力,确实是架构兼容性问题。在为每个架构构建静态库之后,未定义的引用就消失了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2015-07-11
    • 2016-07-30
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多