9

我正在尝试在 Android NDK r8b 下编译 STXXL(顺便说一句,我在较新的 r8c 下也有同样的问题)。

我正在使用 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 实现。有没有人对我如何解决这个问题有任何想法?

如果您需要任何进一步的信息,请询问!

编辑:所以这里的评论之一是我的 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__编译器不会在那部分抛出错误......所以定义永远不会被设置,这大概是我的问题的原因。我还专门添加了一个-D__GXX_EXPERIMENTAL_CXX0X__,但这没有任何区别(它好像它被取消定义了)。

4

1 回答 1

4

我认为您的构建方法过于乐观。我对 STXXL 一无所知,但任何不平凡的项目在他们自己的 make 文件中都有很多细节,所以通过抛出你自己的 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++

起初构建因文件中的问题而失败./io/ufs_file_base.cpp。Android / Bionic 不支持一些过时的用途S_IREADS_IWRITE请参阅错误报告参考

您应该如下更新第 88 行

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

然后

<same build command again>

现在你应该libstxxl.alib。我不知道这是否真的有效,但由于这是一个构建问题,我希望它能回答或给你一些指导。

最后一点是关于 ARM EABI。正如您在指定目录中看到的那样,上面的命令使用,如果适用于您的目标armeabi,您可能希望使用armeabi-v7a它,因为它较新。从您的错误消息中,我可以看到特定版本的目标是xscale,如果这不是故意的,那么让自己熟悉 ARM 架构/产品系列可能是个好主意。

于 2012-11-21T14:39:36.953 回答