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
के साथ अपेक्षित कार्य करता है।
मैं एसटीएल के कई हिस्सों का उपयोग कर रहा हूं, और अब तक देखा गया एकमात्र ध्यान देने योग्य अंतर यह चुप है NOP
stringstream
। मैं भी 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
इन परिस्थितियों को देखते हुए विफल रहता है में कुछ जानकारी दे सकते हैं, और क्यों यह सिर्फ इतना है कि यह करने के लिए प्रदर्शित किया किसी भी डेटा पर एक एनओपी करके विफल रहता है?
धन्यवाद
मैं ने वही समस्या हो रही थी और कहा कि lib मेरे लिए चाल किया :) – unbekant
लोड हो रहा है libatomic मदद की आर्मेबी लक्ष्य – Sam
अजीब के लिए निर्माण के लिए, लेकिन कुछ संघर्ष करने के बाद मैं केवल 'APP_LDFLAGS + = -latomic' जोड़ने के बाद संकलित करने में सक्षम था LDLIBS ने मेरे लिए काम नहीं किया था। –