使用gnustl_static构建外部模块时找不到libstdc ++

时间:2012-06-12 20:04:52

标签: build android-ndk android-build android-ndk-r7

我正在将gnustl_static添加到外部Android模块中,当我构建它时,我收到以下错误。

make: *** No rule to make target `prebuilt/ndk/android-ndk-r7/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/libstdc++.a', needed by `out/target/product/msm8960/obj/SHARED_LIBRARIES/liballjoyn_intermediates/LINKED/liballjoyn.so'.  Stop.

当我查看“prebuilt / ndk / android-ndk-r7 / sources / cxx-stl / gnu-libstdc ++ / libs / armeabi-v7a /”时,我找不到libstdc ++。有一个fild libsupc ++。

构建系统是从它所声明的“build / core”文件夹中找到的binary.mk文件中获取的。

    # LOCAL_NDK_STL_VARIANT is gnustl_static
my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/include \
                           $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/include
my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/libstdc++.a

问题是我不知道该错过什么。

预构建文件夹中有许多libstdc ++副本,但在列出的位置找不到它们。可以在

中找到
prebuild/ndk/$(ANDRIOD_NDK_VERSION)/platforms/$(ANDROID_SDK_VERSION)/$(ARCHETECTURE_TYPE)/usr/lib/libstdc++.a

这是我的Android.mk文件的缩写形式:

LOCAL_PATH := $(call my-dir)

# Rules to build libabc.so

include $(CLEAR_VARS)

LOCAL_CPP_EXTENSION := .cc

LOCAL_SDK_VERSION := 8
LOCAL_NDK_VERSION := 7
LOCAL_NDK_STL_VARIANT := gnustl_static

LOCAL_CFLAGS += \
        -std=gnu++0x

LOCAL_C_INCLUDES := \
        external/abc/inc \
        external/openssl/include

LOCAL_SRC_FILES := \
        file1.cc \
        file2.cc

LOCAL_SHARED_LIBRARIES := \
        libcrypto \
        libssl \
        liblog

LOCAL_PRELINK_MODULE := false

LOCAL_REQUIRED_MODULES := \
         external/openssl/crypto/libcrypto \
         external/openssl/ssl/libssl

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libabc

include $(BUILD_SHARED_LIBRARY)

任何人都有任何想法如何解决“没有规则制定目标”构建问题?

2 个答案:

答案 0 :(得分:1)

找到解决方案:

简单的答案是我需要将LOCAL_NDK_VERSION版本从7更改为5或6。

复杂的答案是,binary.mk文件尚未更新,无法解释NDK-7发布时所做的更改。

在NDK-5和NDK-6中使用gnustl_static时,包含STL所有内容的库文件位于libstdc ++中.a位于binary.mk文件中指定的位置。发布NDK-7后,库名从libstdc ++。a更改为libgnustl_static.a。它看起来不像binary.mk更新以解释此更改。

这并不奇怪,因为似乎没有项目使用gnustl_static。我在android存储库中的所有代码中执行了grep,我发现使用设置为gnustl_static的LOCAL_NDK_VERSION的唯一代码是我自己的。

答案 1 :(得分:-1)

您不应使用LOCAL_NDK_STL_VARIANT来选择STL变体。

您应该在APP_STL := gnustl_static文件中使用Application.mk