Компиляция STXXL под Android NDK r8b



c++ in android (1)

Я думаю, что ваш подход к построению слишком оптимистичен. Я ничего не знаю о STXXL, но в любом нетривиальном проекте есть много деталей в их собственных файлах, поэтому, бросая ваш собственный Android.mk и пытаясь включить все возможные файлы исходного кода в сборку, не должно работать.

Если вы хотите использовать ndk-build, вам следует внимательно изучить проект и понять его детали и включить их в ваш новый файл Android.mk. Например, если вы проверяете external каталог в репозитории Android ( в github они перечислены как несколько подпроектов ), вы можете увидеть много проектов с открытым исходным кодом и как они внедряются в систему сборки Android.

После долгого и скучного сообщения я бы предложил использовать NDK как отдельную цепочку инструментов. Вы можете прочитать об этом $NDK/docs/STANDALONE-TOOLCHAIN.html . Короче говоря, я смог скомпилировать STLXX как статическую библиотеку с помощью приведенной ниже команды (мой ndk был установлен в ~ / bin)

NDK = ~ / bin / android-ndk-r8c PTHREAD_FLAG = COMPILER = "$ NDK / toolchains / arm-linux-androideabi-4.6 / prebuilt / linux-x86 / bin / arm-linux-androideabi-g ++ --sysroot = $ NDK / platform / android-14 / arch-arm -I $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / include -I $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / libs / armeabi / include -L $ NDK / sources / cxx-stl / gnu-libstdc ++ / 4.6 / libs / armeabi / -lgnustl_shared "сделать library_g ++

Поначалу сборка завершается с ошибкой в ​​файле ./io/ufs_file_base.cpp . Есть некоторые устаревшие виды использования S_IREAD и S_IWRITE которые не поддерживаются Android / Bionic. См. Отчет об ошибке и ссылку .

Вы должны обновить строку 88, как показано ниже.

const int perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;

тогда

<same build command again>

теперь вы должны получить libstxxl.a под lib . Я не знаю, действительно ли это работает или нет, но поскольку это был вопрос сборки, я надеюсь, что он ответит или даст вам некоторые указания.

Последняя заметка касается ARM EABI. Выше команда использует armeabi как вы можете видеть в указанных каталогах, вы можете использовать armeabi-v7a если это применимо к вашей цели, поскольку это новее. Из сообщений об ошибках я вижу, что конкретная сборка была нацелена на xscale , если это не преднамеренно, может быть хорошей идеей познакомиться с архитектурой ARM / семейством продуктов.

Я пытаюсь скомпилировать STXXL под Android NDK r8b (у меня такая же проблема при новой r8c btw).

Я компилирую с помощью gnustl_static.

Мне нужна поддержка C ++ 11, поэтому я попытался настроить

LOCAL_CPPFLAGS := -std=c++11

но это породило ошибку в отношении uint64_t.

Поэтому я изменил флаг на

LOCAL_CPPFLAGS :=-std=gnu++11

Это помогает честно, но когда он начинает компиляцию, я получаю сообщение об ошибке gnu stl.

Users/Gozzeh/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include -I/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/include -Ijni -DANDROID  -Wa,--noexecstack -fexceptions -frtti -Dnullptr=0 -D_ANDROID -std=gnu++11 -Ijni/STXXL/include -fexceptions  -O2 -DNDEBUG -g   -I/Users/Gozzeh/android-ndk-r8b/platforms/android-8/arch-arm/usr/include -c  jni/STXXL/algo/copy_and_sort_file.cpp -o ./obj/local/armeabi/objs/stxxl/STXXL/algo/copy_and_sort_file.o 
In file included from /Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/set:60:0,
                 from jni/STXXL/include/stxxl/bits/io/simdisk_file.h:33,
                 from jni/STXXL/include/stxxl/bits/io/io.h:20,
                 from jni/STXXL/include/stxxl/io:13,
                 from jni/STXXL/algo/copy_and_sort_file.cpp:18:
/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h: In member function 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Base_ptr, const _Val&)':
/Users/Gozzeh/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:1011:39: error: '_Arg' was not declared in this scope

Я также получаю всю нагрузку больше ошибок, связанных с этим параметром _Arg.

Поэтому, глядя на первую, функция выглядит следующим образом:

template<typename _Key, typename _Val, typename _KeyOfValue,
           typename _Compare, typename _Alloc>
#ifdef __GXX_EXPERIMENTAL_CXX0X__
    template<typename _Arg>
#endif
    typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
    _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
#ifdef __GXX_EXPERIMENTAL_CXX0X__
    _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, _Arg&& __v)
#else
    _M_insert_(_Const_Base_ptr __x, _Const_Base_ptr __p, const _Val& __v)
#endif
    {
      bool __insert_left = (__x != 0 || __p == _M_end()
                || _M_impl._M_key_compare(_KeyOfValue()(__v), 
                              _S_key(__p)));

      // This line is the error location.
      _Link_type __z = _M_create_node(_GLIBCXX_FORWARD(_Arg, __v)); 

      _Rb_tree_insert_and_rebalance(__insert_left, __z,
                    const_cast<_Base_ptr>(__p),  
                    this->_M_impl._M_header);
      ++_M_impl._M_node_count;
      return iterator(__z);
    }

Я не могу понять, где возникает проблема. Является ли gnu ++ 11 не определяющим __GXX_EXPERIMENTAL_CXX0X__ ? Или проблема в том, что он не используется где-то правильно? Я очень смущен относительно того, что вызывает проблему? У меня есть компиляция STXXL с gnu ++ 11 под clang на iphone, но я предполагаю, что iphone, вероятно, использует другую реализацию STL. Кто-нибудь получил какие-либо идеи о том, как я могу решить эту проблему?

Если вам нужна дополнительная информация, просто спросите!

Изменить: так далее к одному из комментариев здесь относится мое приложение application.mk

APP_PLATFORM := android-8 
APP_STL      := gnustl_static
APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti 
APP_OPTIM    := release APP_ABI      := all

и это мой android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
rwildcard       = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

LOCAL_MODULE    := stxxl
LOCAL_CPP_FEATURES += exceptions
FILE_LIST       := $(call rwildcard, $(LOCAL_PATH)/STXXL/,*.cpp)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_CPPFLAGS  := -Dnullptr=0 -D_ANDROID -D__STDC_INT64__ -std=gnu++11 -I$(LOCAL_PATH)/STXXL/include
include $(BUILD_SHARED_LIBRARY)

Редактировать: Интересно, что я просто попытался разместить #error temp внутри блока #ifdef __GXX_EXPERIMENTAL_CXX0X__ в функции stl_tree.h, которую я опубликовал. Компилятор НЕ выбрасывает ошибку в этой части ... поэтому определение никогда не будет установлено, что, по-видимому, является причиной моих проблем. Я также специально добавил -D__GXX_EXPERIMENTAL_CXX0X__ но это не имеет значения (как будто он получает undef'd).





stxxl