2014-04-13 15 views
24

tl; डॉ: सवाल क्यों std::stringstream "विफल रहता है" के लिए एक स्पष्टीकरण के लिए है, और क्यों यह (वैसे यह करता है में विफल रहता है के द्वारा बस कुछ भी नहीं कर रहा है), एक पुनर्निर्मित C++ _ साझा लाइब्रेरी से लिंक करते समय।एंड्रॉयड NDK एसटीएल C++ _ std :: stringstream एनओपी में/साझा डब्ल्यू LIBCXX_FORCE_REBUILD परिणाम

एक न्यूनतम उदाहरण:

std::stringstream ss; 
ss << "Hello World"; 
__android_log_print(ANDROID_LOG_INFO, 
        "APP", 
        "Length: %i", ss.str().size()); 

जब

APP_STL := c++_shared 
LIBCXX_FORCE_REBUILD := true 

के साथ इस परियोजना उत्पादन Length: 0 है संकलन। APP_STL := c++_static या LIBCXX_FORCE_REBUILD := false का उपयोग करते समय, stringstream आउटपुट के रूप में Length: 11 के साथ अपेक्षित कार्य करता है।

मैं एसटीएल के कई हिस्सों का उपयोग कर रहा हूं, और अब तक देखा गया एकमात्र ध्यान देने योग्य अंतर यह चुप है NOPstringstream। मैं भी libgl2jni NDK नमूना संशोधित करके इस परीक्षण किया है, के रूप में Application.mk फ़ाइल जोड़ने:

NDK_TOOLCHAIN_VERSION := 4.8 
APP_OPTIM := release 
APP_STL := c++_shared 
APP_ABI := armeabi-v7a #armeabi-v7a x86 
APP_PLATFORM := android-19 
LIBCXX_FORCE_REBUILD := true 

मैं रिहाई/डिबग, APP_STL ग के रूप में के रूप में APP_OPTIM के विभिन्न क्रमपरिवर्तन परीक्षण किया है ++ _ साझा/सी armeabi और armeabi-v7a दोनों ABI के रूप में ++ _ स्थिर, और LIBCXX_FORCE_REBUILD एक Nexus-4 पर, सत्य/गलत के रूप में।

|-------------+-----------+----------------------+---------+------------------| 
| ABI   | stl c++_? | LIBCXX_FORCE_REBUILD | optim | Result   | 
|-------------+-----------+----------------------+---------+------------------| 
| armeabi  | static | true     | release | OK    | 
|    | static | true     | debug | OK    | 
|    | static | false    | release | BUILD FAILED [1] | 
|    | static | false    | debug | BUILD FAILED [1] | 
|    | shared | true     | release | NOP    | 
|    | shared | true     | debug | NOP    | 
|    | shared | false    | release | OK    | 
|    | shared | false    | debug | OK    | 
|-------------+-----------+----------------------+---------+------------------| 
| armeabi-v7a | static | true     | release | OK    | 
|    | static | true     | debug | OK    | 
|    | static | false    | release | OK    | 
|    | static | false    | debug | OK    | 
|    | shared | true     | release | NOP    | 
|    | shared | true     | debug | NOP    | 
|    | shared | false    | release | OK    | 
|    | shared | false    | debug | OK    | 
|-------------+-----------+----------------------+---------+------------------| 

[1]/opt/android-NDK-r9d/स्रोतों/CXX-STL/LLVM-libC++/libs/armeabi/libC++ static.a (ios.o): परिणाम यह रहा:/tmp/ndk-andrewhsieh/tmp/build-21097/build-libC++/ndk/स्रोत/cxx-stl/llvm-libC++/libcxx/src/ios.cpp: फ़ंक्शन std :: _1 :: ios_base :: xalloc() : त्रुटि: '__atomic_fetch_add_4'

पी एस को अपरिभाषित संदर्भ: इन परीक्षणों के बीच में एक ndk-build clean करने के लिए सुनिश्चित करें।

प्रश्न: किसी को भी क्यों std::stringstream इन परिस्थितियों को देखते हुए विफल रहता है में कुछ जानकारी दे सकते हैं, और क्यों यह सिर्फ इतना है कि यह करने के लिए प्रदर्शित किया किसी भी डेटा पर एक एनओपी करके विफल रहता है?

धन्यवाद

उत्तर

22

मैं उत्तर नहीं दे सकता क्यों एनओपी कुछ क्रमपरिवर्तन में हो रहा है। लेकिन मैंने निर्माण विफलताओं के बारे में पता लगाने का प्रबंधन किया।

मैं आपके से बदतर स्थिति में था। मैं C++ _ स्थिर और LIBCXX_FORCE_REBUILD (झूठी) के लिए डिफ़ॉल्ट मान के संयोजन से संबंधित निर्माण विफलताओं का अनुभव कर रहा था और मुझे पता नहीं था कि क्यों।

एसटीएल को जोड़ने के विभिन्न क्रमपरिवर्तनों में अपना शोध साझा करने के लिए धन्यवाद - मैं बिल्ड त्रुटि को ठीक करने के लिए सीधे मुख्य दस्तावेज़ में कूदने में सक्षम था।

It's likely that you need libatomic if you #include . Add "LOCAL_LDLIBS += -latomic" for ndk-build

libatomic आप 4 करने के लिए अपने NDK_TOOLCHAIN_VERSION निर्धारित करने की आवश्यकता उपयोग करने में सक्षम होने के लिए।8

+1

मैं ने वही समस्या हो रही थी और कहा कि lib मेरे लिए चाल किया :) – unbekant

+0

लोड हो रहा है libatomic मदद की आर्मेबी लक्ष्य – Sam

+0

अजीब के लिए निर्माण के लिए, लेकिन कुछ संघर्ष करने के बाद मैं केवल 'APP_LDFLAGS + = -latomic' जोड़ने के बाद संकलित करने में सक्षम था LDLIBS ने मेरे लिए काम नहीं किया था। –

2

इस प्रयास करें:

LOCAL_LDFLAGS += -Wl,--gc-sections 

ऐसा लगता है कि कोड स्निपेट वास्तव में atomic_fetch_add नहीं कहा जाता है()। - जीसी-सेक्शन एलडी विकल्प के साथ, लिंकर अंतिम निष्पादन योग्य या साझा लाइब्रेरी से अप्रयुक्त कोड और डेटा को खत्म कर देगा। ताकि atomic_fetch_add() की निर्भरता को हटा दिया जा सके। की "--gc वर्गों"

विवरण: https://gcc.gnu.org/onlinedocs/gnat_ugn/Compilation-options.html

कुछ अन्य जानकारी: https://code.google.com/p/android/issues/detail?id=68779

+8

क्या आप समझा सकते हैं कि ये झंडे क्या करते हैं? आपके उत्तर को निर्देशक होना चाहिए, समस्या को टाइप करने और हल करने के लिए कुछ नहीं। – pedromanoel

+0

@foqq पूर्ण संदर्भ के साथ बग लिंक के लिए धन्यवाद। – dcow

संबंधित मुद्दे