从命令行运行程序时C ++错误“失败:locale :: facet :: _ S_create_c_locale名称无效”

时间:2013-11-20 19:30:02

标签: c++ utf-8 g++ locale libstdc++

我似乎在使用C ++中的语言环境时遇到问题。当我从Eclipse中运行我的程序时,一切正常。但是,当我尝试从命令行运行时,我不断收到此错误:

失败:locale :: facet :: _ S_create_c_locale名称无效

这是触发错误的代码:

// Set up UTF8 file stream
string fileName = "./sz.txt";
wifstream inFileStream;

try {
    setlocale(LC_ALL, "");
    inFileStream.open(fileName.c_str());
    inFileStream.imbue(locale(""));
    if(!inFileStream) {
    return EXIT_FAILURE;
    }
}
catch (const std::exception &exc) {
    wcout << "Error while trying to create UTF8 file stream." << endl;
    std::cerr << exc.what() << endl;
    if( inFileStream.is_open() )
        inFileStream.close();

    return EXIT_FAILURE;
}

“locale”的输出提供以下内容:

LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL="de_DE.UTF-8"

我还尝试使用“de_DE.UTF-8”作为语言环境字符串而不是“”(实际应该是这样),但这给了我同样的错误。

奇怪的是,从Eclipse中运行时程序运行正常。我使用g ++从命令行编译以下版本:

配置: - prefix = / Applications / Xcode.app / Contents / Developer / usr --with-gxx-include-dir = / usr / include / c ++ / 4.2.1 Apple LLVM 5.0版(clang-500.2.79)(基于LLVM 3.3svn) 目标:x86_64-apple-darwin12.4.0 线程模型:posix

知道这里可能有什么问题吗?

干杯,

马丁

1 个答案:

答案 0 :(得分:4)

  

失败:locale :: facet :: _ S_create_c_locale名称无效

这种失败在GCC没有足够好的语言环境支持的非GNU平台上是典型的。请参阅手册和那里的--enable-clocale libstdc ++选项说明:

  

选择特定于目标的基础语言环境包。选择'ieee_1003.1-2001'以指定基于langinfo / iconv / catgets的X / Open,标准Unix(IEEE标准1003.1-2001)模型,'gnu'以基于GNU C的功能指定模型library(langinfo / iconv / gettext)(来自glibc,GNU C库),'generic'使用通用的“C”抽象,它由“C”语言环境信息组成,'newlib'指定Newlib C库模型只有与处理ctype时的'通用'模型不同,或者'darwin'省略了'泛型'模型所需的wchar_t特化。

     

如果没有明确指定,配置过程会尝试从上面的选项中猜出最合适的包。默认为“通用”。在基于glibc的足够复古系统(2.3及更新版本)上,会自动选择“gnu”。在基于newlib的系统('--with_newlib = yes')和OpenBSD上,会自动选择'newlib'。在Mac OS X上,自动选择“darwin”。此选项可以更改库ABI。

如果你看一下libstdc ++库的来源,你会发现除了'gnu'模型之外,所有其他模型都是非常多的存根,只支持“C”语言环境。有些平台根本没有线程安全的语言环境支持。其他平台,如Darwin(AFAIK,我不拥有或无权访问MacOS X Darwin),确实提供了足够的线程安全的语言环境API(xlocale),这些API可以在libstdc ++中实现完整的C ++语言环境支持。不幸的是,还没有人这样做过。