Android ndk 无法将预构建的静态库与Android NDK中的共享库链接 AOSP 7.1.1_r50树
我正在尝试将libmytest构建为共享库。 libmytest需要链接到libsecuretest.a这是一个预构建的静态库。Android ndk 无法将预构建的静态库与Android NDK中的共享库链接 AOSP 7.1.1_r50树,android-ndk,linker,static-libraries,android-source,static-linking,Android Ndk,Linker,Static Libraries,Android Source,Static Linking,我正在尝试将libmytest构建为共享库。 libmytest需要链接到libsecuretest.a这是一个预构建的静态库。 makelibsecuretest命令成功生成,但当我执行makelibmytest命令时,链接器命令出现失败错误。您可以找到完整的输出日志 P: LBSeCURESTest.A是用NDK构建的C++库。 以下是位于libmytest目录中的Android.mk文件的内容: LOCAL_PATH := $(call my-dir) include $(CLEAR
makelibsecuretest
命令成功生成,但当我执行makelibmytest
命令时,链接器命令出现失败错误。您可以找到完整的输出日志
<强> P:<强> LBSeCURESTest.A是用NDK构建的C++库。 以下是位于libmytest目录中的Android.mk文件的内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmytest
LOCAL_SRC_FILES := \
curve_test.c \
my_test.c \
LibSecureTest_Wrapper.cpp
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../../emulator/include
LOCAL_CFLAGS := -DANDROID -g -DTA_PLUGIN
LOCAL_CPPFLAGS := -std=c++11
LOCAL_CPP_EXTENSION := .cpp
LOCAL_NDK_STL_VARIANT := c++_static
LOCAL_SHARED_LIBRARIES := libc libstdc++ libA libB libC
LOCAL_STATIC_LIBRARIES := libsecuretest
ifeq ($(TARGET_ARCH),arm)
LOCAL_LDFLAGS := -Wl,--hash-style=sysv
endif
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libsecuretest
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsecuretest.a
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)
下面是位于libsecuretest目录中的Android.mk文件的内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmytest
LOCAL_SRC_FILES := \
curve_test.c \
my_test.c \
LibSecureTest_Wrapper.cpp
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../../emulator/include
LOCAL_CFLAGS := -DANDROID -g -DTA_PLUGIN
LOCAL_CPPFLAGS := -std=c++11
LOCAL_CPP_EXTENSION := .cpp
LOCAL_NDK_STL_VARIANT := c++_static
LOCAL_SHARED_LIBRARIES := libc libstdc++ libA libB libC
LOCAL_STATIC_LIBRARIES := libsecuretest
ifeq ($(TARGET_ARCH),arm)
LOCAL_LDFLAGS := -Wl,--hash-style=sysv
endif
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libsecuretest
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsecuretest.a
LOCAL_MODULE_SUFFIX := .a
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)
我不知道我到底错过了什么。非常感谢您的帮助。您的问题可能是因为您混合了不同的STL(版本) 您的大多数“未定义引用”与以下内容有关:
std::__1
std::__ndk1
比如:
请尝试使用AOSP构建来编译“libsecuretest”(可能libc++版本有所不同)
注:
我尝试检查我的AOSP libc++符号(平台版本=6.0.1),并获得:
我还用libc++从手机Pixel2(Android9)S8(android 8.0.0)中获得了相同的符号
[并使用相同的“nm”命令进行检查…]
但ndk18的符号是:
$nm -DC libc++_shared.so | grep 'locale::locale()'
00000000000865b0 T std::__ndk1::locale::locale()
00000000000865b0 T std::__ndk1::locale::locale()
您的问题可能是因为您混合了不同的STL(版本) 您的大多数“未定义引用”与以下内容有关:
std::__1
std::__ndk1
比如:
请尝试使用AOSP构建来编译“libsecuretest”(可能libc++版本有所不同)
注:
我尝试检查我的AOSP libc++符号(平台版本=6.0.1),并获得:
我还用libc++从手机Pixel2(Android9)S8(android 8.0.0)中获得了相同的符号
[并使用相同的“nm”命令进行检查…]
但ndk18的符号是:
$nm -DC libc++_shared.so | grep 'locale::locale()'
00000000000865b0 T std::__ndk1::locale::locale()
00000000000865b0 T std::__ndk1::locale::locale()
注意:对于“未定义对“\uuu系统\u属性\u获取”的引用,您还有一个问题。注意:对于“未定义对”\uu系统\u属性\u获取”的引用,您还有一个问题。这种构建无法完成。NDK的libc++和平台的libc++按照不同的时间表更新,可能有不同的ABI。NDK静态库不应链接到平台库中。这种构建无法完成。NDK的libc++和平台的libc++按照不同的时间表更新,可能有不同的ABI。NDK静态库不应链接到平台库。