Tôi đang cố gắng biên dịch STXXL dưới Android NDK r8b (Tôi có cùng một vấn đề với btc r8c mới hơn).Biên dịch STXXL dưới Android NDK r8b
Tôi đang biên dịch bằng gnustl_static.
tôi cần sự ủng hộ 11 C++ vì thế ban đầu tôi đã cố gắng thiết lập
LOCAL_CPPFLAGS := -std=c++11
nhưng điều này ném lên một lỗi về uint64_t.
Vì vậy, tôi đã thay đổi cờ để
LOCAL_CPPFLAGS :=-std=gnu++11
Điều này giúp một chút công bằng nhưng khi nó bắt đầu biên soạn tôi nhận được một lỗi liên quan đến việc STL gnu.
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
Tôi cũng nhận được toàn bộ tải thêm lỗi liên quan đến thông số _Arg này.
Vì vậy, nhìn vào cái đầu tiên các chức năng trông giống như sau:
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);
}
tôi có thể không thực sự hiểu nơi mà vấn đề được phát sinh. Là gnu ++ 11 không xác định __GXX_EXPERIMENTAL_CXX0X__
? Hoặc là vấn đề mà nó không được sử dụng ở đâu đó đúng cách? Tôi rất bối rối về những gì đang gây ra vấn đề? Tôi có STXXL biên dịch với gnu ++ 11 dưới clang trên iphone nhưng tôi đoán rằng iphone có lẽ là sử dụng một thực hiện STL khác nhau. Có ai có bất kỳ ý tưởng về cách tôi có thể khắc phục vấn đề này?
Nếu bạn cần thêm bất kỳ thông tin nào, hãy hỏi!
Edit: Vì vậy, hơn nữa để một trong những bình luận ở đây là application.mk tôi
APP_PLATFORM := android-8
APP_STL := gnustl_static
APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
APP_OPTIM := release APP_ABI := all
và đây là android.mk tôi:
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)
Edit: Điều thú vị là tôi đã thử đặt một số #error temp
bên trong #ifdef __GXX_EXPERIMENTAL_CXX0X__
b khóa trong hàm stl_tree.h tôi đã đăng. Trình biên dịch KHÔNG ném một lỗi trên phần đó ... do đó định nghĩa không bao giờ được thiết lập, có lẽ, nguyên nhân của các vấn đề của tôi. Tôi cũng đã cụ thể thêm một -D__GXX_EXPERIMENTAL_CXX0X__
nhưng điều đó làm cho không có sự khác biệt (của nó như thể nó được undef'd).
Có thể là phiên bản g ++ của bạn không biết 'std = C++ 11'Bạn đã thử' -std = C++ 0x' chưa? – juanchopanza
@juanchopanza: Tôi đã thử gnu ++ 0x (vì uint64_t không được định nghĩa trong C++ 0x/11) và tôi nhận được chính xác cùng một vấn đề. Nó biên dịch tốt nếu tôi đặt gnu ++ 03 nhưng sau đó tôi mất hỗ trợ C++ 11: ( – Goz
bạn đã có 'Android.mk' và' Application.mk' để bắt đầu? –