【问题标题】:Android NDK doesn't link prebuilt libraryAndroid NDK 不链接预建库
【发布时间】:2017-02-05 16:26:40
【问题描述】:

我正在尝试将 C 静态库链接到 C++ 共享库,但共享库似乎完全忽略了 LOCAL_STATIC_LIBRARIES 行,并且没有链接静态库。

TextureEngine 是静态库,CustomTexture 是共享库。这是制作文件


静态库 - TextureEngine

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := TextureEngine
LOCAL_SRC_FILES := ../TextureEngine.c
# LOCAL_SHARED_LIBRARIES := 
#LOCAL_LDLIBS := -llog -landroid -lGLESv2
include $(BUILD_STATIC_LIBRARY)

Application.mk:

APP_ABI := all
APP_PLATFORM := android-23
APP_MODULES := TextureEngine

共享库 - CustomTexture

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := TextureEngine
LOCAL_SRC_FILES := \
    ../TextureEngine/obj/local/$(TARGET_ARCH_ABI)/libTextureEngine.a
LOCAL_LDLIBS += -landroid -lGLESv2 -lm -lz -llog 
include $(PREBUILT_STATIC_LIBARAY)


include $(CLEAR_VARS)
LOCAL_MODULE    := CustomTexture
LOCAL_STATIC_LIBRARIES := TextureEngine
LOCAL_C_INCLUDES := ../TextureEngine
LOCAL_SRC_FILES := \
    ../CustomTexture.cpp \
    ../TextureProvider.cpp \
    ../Logfile.c \
    ../SineImage.cpp
LOCAL_LDLIBS += -landroid -lGLESv2 -lm -lz -llog 
include $(BUILD_SHARED_LIBRARY)

应用程序.mk

APP_STL := gnustl_static
APP_CPPFLAGS += -std=c++11
APP_ABI := all
APP_PLATFORM := android-23

当我在 TextureEngine 上运行 ndk-build 时,我会在所有架构文件夹中获得 libTextureEngine.a 文件。然而,当我在 CustomTexture 上运行 ndk-build 时,我得到了未定义的引用。

在 CustomTexture 上运行 V=1 的 ndk-build 会给出

[arm64-v8a] SharedLibrary  : libCustomTexture.so
/opt/android-ndk-r12b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++ -Wl,-soname,libCustomTexture.so -shared --sysroot=/opt/android-ndk-r12b/platforms/android-23/arch-arm64 ./obj/local/arm64-v8a/objs/CustomTexture/__/CustomTexture.o ./obj/local/arm64-v8a/objs/CustomTexture/__/TextureProvider.o ./obj/local/arm64-v8a/objs/CustomTexture/__/Logfile.o ./obj/local/arm64-v8a/objs/CustomTexture/__/SineImage.o /opt/android-ndk-r12b/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libgnustl_static.a -lgcc -no-canonical-prefixes  -Wl,--build-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings  -L/opt/android-ndk-r12b/platforms/android-23/arch-arm64/usr/lib -landroid -lGLESv2 -lm -lz -llog -lc -lm -o ./obj/local/arm64-v8a/libCustomTexture.so

您可能会看到 - TextureEngine 没有出现在链接器行中。果然,我可以在 CustomTexture 的 Android.mk 的预构建部分更改 LOCAL_SRC_FILES - 并且不会出现新的错误。

为什么 ndk-build 不尝试链接 TextureEngine?

【问题讨论】:

    标签: android c++ c android-ndk linkage


    【解决方案1】:
    include $(PREBUILT_STATIC_LIBARAY)
    

    因为这里的错字。 LIBRARY,不是LIBARAY :)

    实际上我昨晚发现了一个错误,LOCAL_STATIC_LIBRARIESLOCAL_SHARED_LIBRARIES 中不存在的模块实际上不会导致错误,这解释了为什么它很容易犯这种错误并且没有任何明显的错误你的构建。

    【讨论】:

    • 我简直不敢相信。我不想分享这个错字占用了项目缓冲区的时间。非常感谢!
    • 如果 ndk-build 没有在文件中找到其中一个包含项 + LOCAL_STATIC_INDLUDES 引用了不存在的库,我有点惊讶。
    • 是的,这对我来说也是一个惊喜。我刚刚上传了一个应该在 r14 中的修复:github.com/android-ndk/ndk/issues/208
    • 不错。希望能解决这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2012-12-28
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多