【问题标题】:can't find libstdc++ when building external modual using gnustl_static使用 gnustl_static 构建外部模块时找不到 libstdc++
【发布时间】:2012-06-12 20:04:51
【问题描述】:

我正在将 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++.a 有一个 fild libsupc++.a

构建系统正在从它所声明的“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)

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

【问题讨论】:

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


    【解决方案1】:

    找到解决方案:

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

    复杂的答案是 binary.mk 文件尚未更新以说明 NDK-7 发布时所做的更改。

    在 NDK-5 和 NDK-6 中,当使用 gnustl_static 时,包含 STL 的所有内容的库文件位于位于 binary.mk 文件中指定位置的 libstdc++.a 中。当 NDK-7 发布时,库名称从 libstdc++.a 更改为 libgnustl_static.a。看起来 binary.mk 并没有针对这一变化进行更新。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我正在使用 ndk-build 构建应用程序,那将是正确的,但是我正在构建一个位于 android ICS 源中的模块。位于外部项目中。这是使用 Android make 系统,因此做的有点不同。我很自然地先尝试了APP_STL,但它不起作用然后我发现了这个帖子grokbase.com/t/gg/android-building/1235xqd6cr/…
      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-26
      • 2016-07-19
      • 1970-01-01
      相关资源
      最近更新 更多