[英]Compiling STXXL under Android NDK r8b
我正在尝试在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上使用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函数中的#ifdef __GXX_EXPERIMENTAL_CXX0X__
块中放置一个#error temp
。 编译器不会在该部分抛出错误...因此定义永远不会被设置,这可能是我的问题的原因。 我还特意添加了一个-D__GXX_EXPERIMENTAL_CXX0X__
但没有任何区别(就好像它变得不合适)。
我认为你的构建方法太乐观了。 我对STXXL一无所知,但任何非平凡的项目在他们自己的make文件中都有很多细节,所以抛出你自己的Android.mk并尝试包含所有可能的源代码文件来构建应该不起作用。
如果您想使用ndk-build,您应该仔细研究该项目并了解其详细信息,并将其合并到新的Android.mk文件中。 例如,如果您检查Android存储库下的external
目录( 在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_IREAD
和S_IWRITE
一些过时用法。 查看错误报告和参考 。
您应该更新第88行,如下所示
const int perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
然后
<same build command again>
现在你应该在lib
下获得libstxxl.a
。 我不知道这是否真的有效,但由于这是一个构建问题,我希望它能回答或给你一些指示。
最后一点是ARM EABIs。 以上命令使用armeabi
如您在指定目录中看到的那样,您可能希望使用armeabi-v7a
如果适用于您的目标,因为它更新)。 从您的错误消息中我可以看到特定的构建针对的是xscale
,如果这不是故意的,那么让自己熟悉ARM体系结构/产品系列可能是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.