2012-11-15 66 views
9

我想在Android NDK r8b下編譯STXXL(我在新的r8c btw下有同樣的問題)。在Android NDK下編譯STXXL r8b

我正在編譯使用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__?或者是它沒有被正確使用的問題?我很困惑,究竟是什麼導致了這個問題?我有STXXL編譯在iphone上的鏗鏘聲下的gnu ++ 11,但我猜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) 

編輯:有趣的是我只是試着在#ifdef __GXX_EXPERIMENTAL_CXX0X__b內放置#error temp鎖定我發佈的stl_tree.h函數。編譯器不會在該部分拋出錯誤...所以定義從來沒有被設置,這可能是我的問題的原因。我還專門添加了一個-D__GXX_EXPERIMENTAL_CXX0X__,但這沒什麼區別(它好像沒有任何區別)。

+0

難道你的g ++版本不知道'std = C++ 11'你試過了'-std = C++ 0x'嗎? – juanchopanza

+0

@juanchopanza:我已經嘗試過gnu ++ 0x(因爲uint64_t沒有在C++ 0x/11中定義)並且我得到完全相同的問題。它編譯好,如果我設置GNU ++ 03,但是然後我失去了C++ 11支持:( – Goz

+0

你有'Android.mk'和'Application.mk'開頭? –

回答

4

我認爲你的構建方法過於樂觀。我對STXXL一無所知,但任何非平凡的項目在自己的make文件中都有很多細節,所以通過拋出自己的Android.mk並試圖包含所有可能的源代碼文件構建應該不起作用。

如果你想利用ndk-build,你應該仔細研究這個項目並理解它的細節,並將它們融入到你的新Android.mk文件中。例如,如果您在Android存儲庫(in github they are listed as several sub projects)下檢查external目錄,則可以看到許多開源項目以及它們如何引入到Android構建系統中。

經過漫長而無聊的消息,我建議使用NDK作爲獨立的工具鏈。你可以閱讀關於這個$NDK/docs/STANDALONE-TOOLCHAIN.html。總之我是能夠編譯STLXX如通過下面的命令靜態庫(我的NDK安裝在〜/箱)

NDK =〜/斌/ Android的NDK-R8C PTHREAD_FLAG =編譯器=」 $ 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 /庫/ armeabi/-lgnustl_shared」讓library_g ++

起初構建失敗機智h文件./io/ufs_file_base.cpp中存在問題。 Android/Bionic不支持S_IREADS_IWRITE的一些過時用途。請參閱bug reportreference

您應該更新線路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架構/產品系列可能是個好主意。

+0

你是否將它構建爲C++ 11?因爲我可以使用上面的.mk文件來構建它,因爲我可以使用C++ 03來構建它。問題出在C++ 11的某個地方......但是,它構建得很好iPhone與C++ 11 ... – Goz

+0

我可以添加'-std = gnu ++ 11'到C OMPILER =「...」,如果這就是你要求的內容,它就會生成。我無法使用.mk文件構建它。 – auselen

+0

確定有趣...我會檢查一些事情。 – Goz