2012-06-25 32 views
8

Các mã sau hoạt động tốt trên Linux nhưng ném một ngoại lệ trên OS X 10.7:miền địa phương Setting trên OS X treo

#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; 
} 

Kết quả trên OS X là:

locale::facet::_S_create_c_locale Tên không hợp lệ

Tuy nhiên, tiêu chuẩn nói rõ ràng rằng

Tập hợp các giá trị đối số chuỗi hợp lệ là "C", "" và mọi giá trị được triển khai.

Vì vậy, bất kỳ điều gì gây ra hành vi ở trên đều vi phạm tiêu chuẩn.

Trình biên dịch được sử dụng là clang ++ 3.1 (thẻ/Apple/clang-318.0.58); Tôi cũng đã thử nó với GCC 4.7, cài đặt thông qua Homebrew, với kết quả tương tự.

Người khác có thể xác thực vấn đề này không? Điều gì gây ra nó? Tôi có làm gì sai không? Đây có phải là lỗi trong OS X không?

(Có lẽ relates to another xlocale problem này nhưng lỗi là thực sự hoàn toàn khác nhau.)

+0

Tôi nghĩ rằng đây là (gần như) một bản sao của [câu hỏi này] (http://stackoverflow.com/questions/1745045/stdlocale-breakage-on-macos-10-6-with-lang-en-us- utf-8) ... –

+0

@EitanT Tốt, đó là (một * chính xác * trùng lặp)! Cảm ơn. –

+0

Tôi không nghĩ bạn đang sử dụng xlocale. Tôi tin rằng bạn đang gặp vấn đề với libstdC++, sử dụng một thư viện hỗ trợ ngôn ngữ khác (có vẻ như không được hỗ trợ trên OS X, như câu hỏi liên kết EitanT với các trạng thái). Tôi nghĩ nếu bạn chuyển sang libC++, chương trình của bạn sẽ hoạt động. Mặc dù như chi tiết câu hỏi của tôi, có vấn đề với một số miền địa phương trong libC++, vì lỗi trong xlocale. – bames53

Trả lời

2

Tôi không nghĩ rằng bạn đang sử dụng xlocale. Tôi tin rằng vấn đề của bạn là với libstdC++, sử dụng một thư viện hỗ trợ miền địa phương khác không được hỗ trợ trên OS X, như câu hỏi EitanT liên kết với các trạng thái.

Nếu bạn chuyển sang libC++, chương trình của bạn sẽ hoạt động.

0

Áp phích ở trên chính xác ... vấn đề là với libstdC++. Tôi muốn thêm câu trả lời của tôi bởi vì nó không phải là đơn giản làm thế nào để có được OS X để liên kết chống lại libC++ và đã cho tôi hơn một giờ để tìm ra.

Gọi trình biên dịch/liên kết bằng g++ -libstd=libc++ hoặc theo clang++ -libstd=libc++ hoặc bằng bí danh c++ -libstd=libc++ tất cả sẽ không thành công.

Giải pháp cho việc biên soạn chương trình đơn giản từ dòng lệnh thay vì can thiệp vào chi phí gia tăng của Xcode là cho phép Xcode để xử lý các liên kết bằng cách sử dụng lệnh xcrun clang++ -stdlib=libc++

xcrun phép Xcode để quản lý chuỗi công cụ và ý chí xây dựng một tệp thực thi thành công nơi cout.imbue(locale(foo)) sẽ hoạt động thành công.

+3

Thực ra bạn có thể sử dụng libC++ tốt với 'clang ++' khi thực hiện như sau: 'export CXX =" clang ++ - $ cxxver -stdlib = libC++ "' và 'export CXXFLAGS =" - nostdinC++-hệ thống/usr/local/lib/llvm - $ cxxver/include/C++/v1 "' (cho một '$ cxxver' thích hợp). Tôi sẽ * không * dựa vào Xcode ở bất kỳ phần nào của quy trình - đặc biệt sau khi bạn đã cài đặt phiên bản Clang mới hơn thông qua Homebrew. –

+0

Konrad, tôi đánh giá cao sự giúp đỡ, nhưng bạn có thể giúp đỡ một newbie và giải thích nhiều hơn một chút những gì các lệnh làm gì? – user3176017

+2

Lệnh 'export' đặt biến môi trường trong thiết bị đầu cuối của bạn. [Tự làm quen với các biến 'CXX' và' CXXFLAGS'] (http://www.gnu.org/software/make/manual/make.html), chúng rất quan trọng đối với việc phát triển C++ trên Unix. Bây giờ, các tùy chọn được thiết lập với các biến này là '-nostdinC++', nó sẽ vô hiệu hóa việc sử dụng thực thi thư viện chuẩn mặc định. '-libC++' báo cho clang sử dụng libC++ thay vì mặc định (libstdC++), và '-system…' báo cho clang biết tìm nó ở đâu. –