无法 link 使用 Android NDK 中的共享库预构建静态库
Unable to link prebuilt static library with shared library in Android NDK
AOSP 7.1.1_r50 树
├── abi
├── art
├── bionic
├── bootable
├── build
├── cts
├── dalvik
├── developers
├── development
├── device
├── docs
├── external
├── frameworks
├── hardware
├── libcore
├── libnativehelper
├── libtest
│ ├── libA
│ └── libB
│ └── libC
│ └── libmytest
│ └── └── Android.mk
│ └── └── my_test.c
│ └── └── curve_test.c
│ └── └── LibSecureTest_Wrapper.cpp
│ └── libsecuretest
│ └── └── arm64-v8a
│ └── └── └── libsecuretest.a
│ └── └── armeabi-v7a
│ └── └── └── libsecuretest.a
│ └── └── Android.mk
├── ndk
├── out
├── packages
├── pdk
├── platform_testing
├── prebuilts
├── sdk
├── system
├── toolchain
└── tools
我正在尝试将 libmytest 构建为共享库。
libmytest 需要与预建静态库 libsecuretest.a 链接。
make libsecuretest
命令成功构建但是当我执行 make libmytest
命令时给出链接器命令失败错误。可以找到完整的输出日志here.
PS: libsecuretest.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)
这里是位于 libsecuretest 目录中的 Android.mk 文件的内容:
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(版本)
您的大部分 "undefined reference" 都与:
有关
std::__1
std::__ndk1
喜欢:
out/target/product/generic_arm64/obj/STATIC_LIBRARIES/libsecuretest_intermediates/libsecuretest.a(MyUtils.cpp.o):function MyUtils::Int32toHexString(int, int): error: undefined reference to 'std::__ndk1::locale::locale()'
请尝试使用 AOSP 版本编译 "libsecuretest"(可能 libc++ 版本不同)。
注意:
我尝试检查我的 AOSP libc++ 符号 (PLATFORM_VERSION=6.0.1) 并得到:
$ nm -DC libc++.so | grep 'locale::locale()'
000682ad T std::__1::locale::locale()
000682ad T std::__1::locale::locale()
我也从手机 Pixel2(Android9) S8(Andorid 8.0.0)
得到了与 libc++ 相同的符号
adb pull /system/lib/libc++.so
[并使用相同的 "nm" 命令检查它...]
但是ndk18的符号是:
$nm -DC libc++_shared.so | grep 'locale::locale()'
00000000000865b0 T std::__ndk1::locale::locale()
00000000000865b0 T std::__ndk1::locale::locale()
AOSP 7.1.1_r50 树
├── abi
├── art
├── bionic
├── bootable
├── build
├── cts
├── dalvik
├── developers
├── development
├── device
├── docs
├── external
├── frameworks
├── hardware
├── libcore
├── libnativehelper
├── libtest
│ ├── libA
│ └── libB
│ └── libC
│ └── libmytest
│ └── └── Android.mk
│ └── └── my_test.c
│ └── └── curve_test.c
│ └── └── LibSecureTest_Wrapper.cpp
│ └── libsecuretest
│ └── └── arm64-v8a
│ └── └── └── libsecuretest.a
│ └── └── armeabi-v7a
│ └── └── └── libsecuretest.a
│ └── └── Android.mk
├── ndk
├── out
├── packages
├── pdk
├── platform_testing
├── prebuilts
├── sdk
├── system
├── toolchain
└── tools
我正在尝试将 libmytest 构建为共享库。
libmytest 需要与预建静态库 libsecuretest.a 链接。
make libsecuretest
命令成功构建但是当我执行 make libmytest
命令时给出链接器命令失败错误。可以找到完整的输出日志here.
PS: libsecuretest.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)
这里是位于 libsecuretest 目录中的 Android.mk 文件的内容:
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(版本)
您的大部分 "undefined reference" 都与:
有关std::__1
std::__ndk1
喜欢:
out/target/product/generic_arm64/obj/STATIC_LIBRARIES/libsecuretest_intermediates/libsecuretest.a(MyUtils.cpp.o):function MyUtils::Int32toHexString(int, int): error: undefined reference to 'std::__ndk1::locale::locale()'
请尝试使用 AOSP 版本编译 "libsecuretest"(可能 libc++ 版本不同)。
注意:
我尝试检查我的 AOSP libc++ 符号 (PLATFORM_VERSION=6.0.1) 并得到:
$ nm -DC libc++.so | grep 'locale::locale()'
000682ad T std::__1::locale::locale()
000682ad T std::__1::locale::locale()
我也从手机 Pixel2(Android9) S8(Andorid 8.0.0)
得到了与 libc++ 相同的符号adb pull /system/lib/libc++.so
[并使用相同的 "nm" 命令检查它...]
但是ndk18的符号是:
$nm -DC libc++_shared.so | grep 'locale::locale()'
00000000000865b0 T std::__ndk1::locale::locale()
00000000000865b0 T std::__ndk1::locale::locale()