2012-06-25 15 views
8

निम्नलिखित कोड लिनक्स पर ठीक काम करता है, लेकिन ओएस पर एक अपवाद X 10.7 फेंकता है:स्थापना स्थानों दुर्घटनाओं

#include <iostream> 
#include <locale> 
#include <stdexcept> 

int main() try { 
    std::locale::global(std::locale("")); 
    std::cout << "Using locale: " << std::locale().name() << "\n"; 
} 
catch (std::runtime_error const& e) { 
    std::cout << e.what() << "\n"; 
    return 1; 
} 

ओएस एक्स पर उत्पादन किया जाता है:

locale::facet::_S_create_c_locale नाम मान्य नहीं

हालांकि, मानक स्पष्ट रूप से कहा गया है कि

वैध स्ट्रिंग तर्क मानों का सेट "C", "", और कोई कार्यान्वयन-परिभाषित मान है।

तो जो भी ऊपर व्यवहार करता है वह मानक का उल्लंघन कर रहा है।

प्रयुक्त कंपाइलर क्लैंग ++ 3.1 (टैग/ऐप्पल/क्लैंग -318.0.58) है; मैंने उसी परिणाम के साथ होमब्री के माध्यम से स्थापित जीसीसी 4.7 के साथ भी कोशिश की है।

क्या अन्य लोग इस समस्या को मान्य कर सकते हैं? इसका क्या कारण होता है? क्या मैं गलत हूं? क्या यह ओएस एक्स में एक बग है?

(हो सकता है कि इस relates to another xlocale problem लेकिन त्रुटियों वास्तव में पूरी तरह से अलग कर रहे हैं।)

+0

मुझे लगता है कि यह (लगभग) [लगभग प्रश्न] का एक डुप्लिकेट है (http://stackoverflow.com/questions/1745045/stdlocale-breakage-on-macos-10-6-with-lang-en-us- utf-8) ... –

+0

@EitanT अच्छा लगता है, यह है (एक * सटीक * डुप्लिकेट)! धन्यवाद। –

+0

मुझे नहीं लगता कि आप xlocale का उपयोग कर रहे हैं। मेरा मानना ​​है कि आप libstdC++ के साथ समस्या है, जो एक अलग लोकेल समर्थन लाइब्रेरी का उपयोग करता है (जो ओएस एक्स पर स्पष्ट रूप से समर्थित नहीं है, जैसा सवाल राज्यों के लिए ईटनटी लिंक है)। मुझे लगता है कि अगर आप libC++ पर स्विच करते हैं तो आपका प्रोग्राम काम करेगा। हालांकि मेरे प्रश्न के विवरण के रूप में, xlocale में कीड़े की वजह से libC++ में कुछ लोकेशन के साथ समस्याएं हैं। – bames53

उत्तर

2

मुझे नहीं लगता कि आप xlocale का उपयोग कर रहे हैं। मेरा मानना ​​है कि आपकी समस्या libstdC++ के साथ है, जो एक अलग लोकेल समर्थन लाइब्रेरी का उपयोग करती है जो ओएस एक्स पर समर्थित नहीं है, क्योंकि प्रश्न EitanT राज्यों से लिंक है।

यदि आप libC++ पर स्विच करते हैं तो आपका प्रोग्राम काम करेगा।

0

ऊपर पोस्टर सही है ... समस्या libstdC++ के साथ है। मैं अपना जवाब जोड़ना चाहता था क्योंकि यह सीधा नहीं है कि ओएस एक्स को libC++ के खिलाफ लिंक करने के लिए कैसे प्राप्त किया जाए और मुझे पता लगाने के लिए एक घंटे से अधिक समय लगे।

संकलक/लिंकर को g++ -libstd=libc++ या clang++ -libstd=libc++ द्वारा या उपनाम c++ -libstd=libc++ द्वारा सभी विफल हो जाएगा।

बजाय कमांड लाइन से साधारण कार्यक्रम संकलन Xcode का जोड़ा भूमि के ऊपर के साथ खिलवाड़ के लिए समाधान Xcode आदेश xcrun clang++ -stdlib=libc++

xcrun Xcode उपकरण श्रृंखला प्रबंधन और होगा करने की अनुमति देता का उपयोग करके जोड़ने को संभालने के लिए अनुमति देने के लिए है एक सफल निष्पादन योग्य बनाएं जहां cout.imbue(locale(foo)) सफलतापूर्वक काम करेगा।

+3

असल में आप libC++ का उपयोग केवल 'clang ++' के साथ ठीक कर सकते हैं, निम्न कार्य करते समय: 'निर्यात CXX =" clang ++ - $ cxxver -stdlib = libC++ "' और 'निर्यात CXXFLAGS =" - nostdinC++ -isystem/usr/local/lib/llvm - $ cxxver/शामिल/सी ++/v1 "' (उचित '$ cxxver' के लिए)। मैं * प्रक्रिया के किसी भी भाग पर एक्सकोड पर भरोसा नहीं करता - खासकर जब आपने होमब्री के माध्यम से क्लैंग का एक नया संस्करण स्थापित किया है। –

+0

कोनराड, मैं मदद की सराहना करता हूं, लेकिन क्या आप एक नौसिखिया की मदद कर सकते हैं और उन आदेशों को और कुछ और बता सकते हैं? – user3176017

+2

'निर्यात' आदेश आपके टर्मिनल में पर्यावरण चर सेट करते हैं। ['CXX' और 'CXXFLAGS' चर के साथ स्वयं को परिचित करें] (http://www.gnu.org/software/make/manual/make.html), वे यूनिक्स पर सी ++ विकास के लिए महत्वपूर्ण हैं। अब, इन चर के साथ सेट विकल्प '-nostdinC++' हैं, जो डिफ़ॉल्ट मानक लाइब्रेरी कार्यान्वयन का उपयोग अक्षम करता है। '-libC++ 'डिफ़ॉल्ट (libstdC++) के बजाय libC++ का उपयोग करने के लिए क्लैंग को बताता है, और' -सिस्टम ... 'कहता है कि इसे कहां मिलना है। –

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