9

Android NDK r8bでSTXXLをコンパイルしようとしています(新しい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__か? それとも、どこかでうまく使われていないことが問題なのでしょうか? 何が問題を引き起こしているのか、私は非常に混乱していますか?iPhoneのclangでgnu ++ 11を使用してSTXXLをコンパイルしていますが、iPhoneはおそらく別のSTL実装を使用していると思います。この問題を解決する方法について何かアイデアを持っている人はいますか?

さらに情報が必要な場合は、お尋ねください。

編集:ここのコメントの1つにさらに私の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)

編集:興味深いことに、投稿した stl_tree.h 関数#error tempのブロック内#ifdef __GXX_EXPERIMENTAL_CXX0X__コンパイラはその部分でエラーをスローしません...そのため、おそらく私の問題の原因である定義が設定されません。また、特に a を追加しました-D__GXX_EXPERIMENTAL_CXX0X__が、違いはありません (それは undef されているかのようです)。

4

1 に答える 1

4

ビルドに対するあなたのアプローチは楽観的すぎると思います。STXXL については何も知りませんが、重要なプロジェクトには独自のメイク ファイルに多くの詳細があるため、独自の Android.mk をスローし、ビルドする可能性のあるすべてのソース コード ファイルを含めようとしても機能しません。

ndk-build を使用する場合は、プロジェクトを注意深く調べてその詳細を理解し、それらを新しい Android.mk ファイルに組み込む必要があります。たとえば、externalAndroid リポジトリ ( 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 /platforms/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" make library_g++

最初のビルドは file の問題で失敗します./io/ufs_file_base.cpp。Android / Bionic でサポートされていないS_IREADandの古い使用法がいくつかあります。バグ レポートリファレンスS_IWRITEを参照してください。

以下のように行 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 アーキテクチャ/製品ファミリに慣れることをお勧めします。

于 2012-11-21T14:39:36.953 に答える