Не удается найти libstdC++ при построении внешнего модуля с использованием gnustl_static

Я добавляю 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 существует файл libsupC++. a

система сборки получает это из файла binary.mk, находящегося в папке "build/core", в которой указано

    # 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 ответа

Решение

Решение найдено:

Ответ прост: мне нужно изменить версию 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. Я сделал grep по всему коду в хранилище android, и единственный найденный мной код, который использовал LOCAL_NDK_VERSION с gnustl_static, был моим собственным.

Вы не должны использовать LOCAL_NDK_STL_VARIANT выбрать вариант STL.

Вы должны использовать APP_STL := gnustl_static в Application.mk файл.

Другие вопросы по тегам