【发布时间】:2012-11-15 08:33:10
【问题描述】:
我正在尝试在 Android NDK r8b 下编译 STXXL(顺便说一句,我在较新的 r8c 下也遇到了同样的问题)。
我正在使用 gnustl_static 进行编译。
我需要 C++11 支持,所以一开始我尝试设置
LOCAL_CPPFLAGS := -std=c++11
但这引发了一个关于 uint64_t 的错误。
所以我把flag改成了
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 实现。有没有人对我如何解决这个问题有任何想法?
如果您需要任何进一步的信息,请询问!
编辑: 所以这里的 cmet 之一是我的 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__,但这并没有什么区别(就好像它被取消定义了一样)。
【问题讨论】:
-
会不会是你的g++版本不知道
std=c++11-std=c++0x试过了吗? -
@juanchopanza:我尝试过 gnu++0x(因为 uint64_t 未在 c++0x/11 中定义),但我遇到了完全相同的问题。如果我设置 gnu++03,它编译得很好,但是我失去了对 c++11 的支持:(
-
你有
Android.mk和Application.mk的开头吗? -
@AlexCohn:Application.mk 和 Android.mk 已发布。
-
如何触发构建? ndk-build 或 ?
标签: android c++ stl android-ndk stxxl