2012-11-15 22 views
9

के तहत STXXL संकलित करना मैं एंड्रॉइड एनडीके आर 8 बी के तहत STXXL संकलित करने की कोशिश कर रहा हूं (मुझे नए आर 8 सी बीटीडब्ल्यू के तहत एक ही समस्या है)।एंड्रॉइड एनडीके आर 8 बी

मैं gnustl_static का उपयोग कर संकलन कर रहा हूं।

मैं तो शुरू में सी ++ 11 समर्थन की जरूरत मैं

LOCAL_CPPFLAGS := -std=c++11 

स्थापित करने की कोशिश की लेकिन इस uint64_t के बारे में त्रुटि ऊपर फेंक दिया।

तो मैं

LOCAL_CPPFLAGS :=-std=gnu++11 

यह एक निष्पक्ष बिट में मदद करता है लेकिन जब यह संकलन शुरू होता है मैं जीएनयू एसटीएल से संबंधित एक त्रुटि प्राप्त करने के लिए झंडा बदल दिया है।

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__ को परिभाषित नहीं कर रहा है? या यह समस्या है कि इसका कहीं कहीं उपयोग नहीं किया जा रहा है? मैं समस्या का कारण बनने के लिए बहुत उलझन में हूं? मेरे पास आईफोन पर क्लैंग के तहत gnu ++ 11 के साथ STXXL संकलन है लेकिन मुझे लगता है कि आईफोन शायद एक अलग एसटीएल कार्यान्वयन का उपयोग कर रहा है। क्या किसी को इस समस्या को हल करने के बारे में कोई विचार है?

यदि आपको कोई और जानकारी चाहिए तो बस पूछें!

संपादित करें: टिप्पणी यहाँ से एक के लिए तो आगे मेरी 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__ बी के अंदर रखने का प्रयास किया मैंने पोस्ट किया 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

क्या आपको 'एंड्रॉइड.एमके' और' एप्लिकेशन.एमके 'के साथ शुरू करने के लिए मिला है? –

उत्तर

4

मुझे लगता है कि निर्माण के लिए आपका दृष्टिकोण बहुत आशावादी है। मुझे एसटीओक्सएल के बारे में कुछ भी पता नहीं है, लेकिन किसी भी गैर-तुच्छ परियोजना में अपनी खुद की फाइलें बनाने में बहुत सारे विवरण हैं, इसलिए अपना खुद का एंड्रॉइड.एमके फेंककर और निर्माण के लिए सभी संभावित स्रोत कोड फ़ाइलों को शामिल करने का प्रयास करना चाहिए।

यदि आप ndk-build का उपयोग करना चाहते हैं, तो आपको सावधानीपूर्वक परियोजना का अध्ययन करना चाहिए और इसके विवरणों को समझना चाहिए और उन्हें अपनी नई Android.mk फ़ाइल में शामिल करना चाहिए। उदाहरण के लिए यदि आप एंड्रॉइड रिपोजिटरी (in github they are listed as several sub projects) के तहत external निर्देशिका की जांच करते हैं तो आप कई ओपन सोर्स प्रोजेक्ट देख सकते हैं और एंड्रॉइड बिल्ड सिस्टम से उन्हें कैसे पेश किया जा सकता है।

लंबे और उबाऊ संदेश के बाद, मैं सुझाव दूंगा कि एनडीके को एक स्टैंडअलोन टूल श्रृंखला के रूप में उपयोग करना है। आप इस $NDK/docs/STANDALONE-TOOLCHAIN.html के बारे में पढ़ सकते हैं।संक्षेप में मैं नीचे आदेश के माध्यम से एक स्थिर पुस्तकालय के रूप में STLXX संकलन करने में सक्षम था (मेरे NDK ~/bin में स्थापित किया गया था)

NDK = ~/bin/android-NDK-R8C PTHREAD_FLAG = संकलक = " $ एनडीके/टूलचेन्स/आर्म-लिनक्स-एंड्रोइडबी-4.6/प्रीबिल्ट/लिनक्स-एक्स 86/बिन/आर्म-लिनक्स-एंड्रोइडबी-जी ++ - एससूट = $ एनडीके/प्लेटफॉर्म/एंड्रॉइड -14/आर्क-आर्म -आई $ एनडीके/स्रोत /cxx-stl/gnu-libstdc++/4.6/include- I $ एनडीके/स्रोत/cxx-stl/gnu-libstdC++/4.6/libs/armeabi/include -L $ एनडीके/स्रोत/cxx-stl/gnu-libstdC++/4.6/libs/armeabi/-lgnustl_shared "library_g बनाने ++

पहले निर्माण पर बुद्धि में विफल रहता है एच ./io/ufs_file_base.cpp फ़ाइल में एक समस्या है। S_IREAD और S_IWRITE के कुछ अप्रचलित उपयोग हैं जो एंड्रॉइड/बायोनिक द्वारा समर्थित नहीं हैं। bug report और reference देखें।

आप

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

तो

<same build command again> 

नीचे के रूप में लाइन 88 अद्यतन करना चाहिए अब आप lib तहत libstxxl.a मिलना चाहिए। मुझे नहीं पता कि यह वास्तव में काम करता है या नहीं, लेकिन चूंकि यह एक बिल्ड सवाल था, मुझे उम्मीद है कि यह जवाब देगा या आपको कुछ दिशानिर्देश देगा।

एक अंतिम नोट एआरएम ईएबीआई के बारे में है। उपरोक्त आदेश armeabi का उपयोग करता है जैसा कि आप निर्दिष्ट निर्देशिका में देख सकते हैं, हो सकता है कि आप अपने लक्ष्य पर लागू होने पर armeabi-v7a का उपयोग करना चाहें। आपके त्रुटि संदेशों से मैं देख सकता हूं कि विशेष निर्माण xscale को लक्षित कर रहा था, यदि यह जानबूझकर नहीं है तो एआरएम आर्किटेक्चर/उत्पाद परिवारों के साथ परिचित होना एक अच्छा विचार हो सकता है।

+0

क्या आप इसे सी ++ 11 के रूप में बना रहे हैं? क्योंकि मैं इसे ऊपर .mk फ़ाइलों का उपयोग करके C++ 03 के रूप में कोई समस्या नहीं बना सकता। समस्या सी ++ 11 के साथ कहीं भी है ... हालांकि यह ठीक बनाता है सी ++ 11 के साथ आईफोन ... – Goz

+0

मैं सी में '-std = gnu ++ 11' जोड़ सकता हूं OMPILER = "..." और यह बनाता है अगर आप यही पूछ रहे हैं। मैं इसे आपकी .mk फ़ाइलों के साथ नहीं बना सका। – auselen

+0

ठीक है दिलचस्प ... मैं कुछ चीजें जांचूंगा। – Goz