2012-11-15 38 views
9

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).

+0

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

+0

@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

+0

bạn đã có 'Android.mk' và' Application.mk' để bắt đầu? –

Trả lời

4

Tôi nghĩ rằng cách tiếp cận của bạn để xây dựng là quá lạc quan. Tôi không biết bất cứ điều gì về STXXL nhưng bất kỳ dự án không tầm thường nào cũng có nhiều chi tiết trong các tệp của riêng họ vì vậy bằng cách ném Android.mk của riêng bạn và cố gắng bao gồm tất cả các tệp mã nguồn có thể xây dựng không hoạt động.

Nếu bạn muốn sử dụng ndk-build, bạn nên nghiên cứu cẩn thận dự án và hiểu chi tiết của dự án và kết hợp chúng vào tệp Android.mk mới. Ví dụ: nếu bạn kiểm tra thư mục external trong kho lưu trữ Android (in github they are listed as several sub projects), bạn có thể thấy nhiều dự án mã nguồn mở và cách chúng được giới thiệu với hệ thống xây dựng Android.

Sau thông điệp dài và nhàm chán, điều tôi đề nghị là sử dụng NDK như một chuỗi công cụ độc lập. Bạn có thể đọc về điều này $NDK/docs/STANDALONE-TOOLCHAIN.html.Nói tóm lại tôi đã có thể biên dịch STLXX như một thư viện tĩnh thông qua các lệnh dưới đây (ndk của tôi đã được lắp đặt tại ~/bin)

NDK = ~/bin/android-ndk-r8c PTHREAD_FLAG = biên dịch =" $ NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-g ++ - sysroot = $ NDK/nền tảng/android-14/arch-arm -I $ NDK/nguồn /cxx-stl/gnu-libstdc++/4.6/include -I $ NDK/nguồn/cxx-stl/gnu-libstdC++/4.6/libs/armeabi/bao gồm -L $ NDK/nguồn/cxx-stl/gnu-libstdC++/4.6/libs/armeabi/-lgnustl_shared "make library_g ++

Lúc đầu xây dựng không thành công h một vấn đề trong tập tin ./io/ufs_file_base.cpp. Có một số cách sử dụng lỗi thời của S_IREADS_IWRITE không được Android/Bionic hỗ trợ. Xem bug reportreference.

Bạn nên cập nhật các dòng 88 như sau

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

sau đó

<same build command again> 

bây giờ bạn sẽ nhận được libstxxl.a dưới lib. Tôi không biết liệu điều này có thực sự hiệu quả hay không nhưng vì đây là một câu hỏi xây dựng, tôi hy vọng nó sẽ trả lời hoặc cung cấp cho bạn một số hướng dẫn.

Một lưu ý cuối cùng là về ARM EABIs. Lệnh trên sử dụng armeabi như bạn có thể thấy trong các thư mục được chỉ định, bạn có thể muốn sử dụng armeabi-v7a nếu có thể áp dụng cho mục tiêu của bạn vì nó mới hơn. Từ thông báo lỗi của bạn, tôi có thể thấy rằng công cụ xây dựng cụ thể đã nhắm mục tiêu xscale, nếu đó không phải là cố ý, bạn nên làm quen với kiến ​​trúc ARM/gia đình sản phẩm.

+0

Bạn đang xây dựng nó như là C++ 11? Bởi vì tôi có thể xây dựng nó không có vấn đề như C++ 03 bằng cách sử dụng các tập tin .mk ở trên.Vấn đề nằm với C++ 11 một nơi nào đó ... tuy nhiên nó xây dựng tốt trên iPhone với C++ 11 ... – Goz

+0

Tôi có thể thêm '-std = gnu ++ 11' vào C OMPILER = "..." và nó xây dựng nếu đó là những gì bạn đang yêu cầu. Tôi không thể xây dựng nó với các tệp .mk của bạn. – auselen

+0

OK thú vị ... Tôi sẽ kiểm tra một vài điều. – Goz

Các vấn đề liên quan