【问题标题】:C++ Error "failure: locale::facet::_S_create_c_locale name not valid" when running program from command line从命令行运行程序时出现 C++ 错误“失败:locale::facet::_S_create_c_locale name not valid”
【发布时间】:2013-12-04 23:46:00
【问题描述】:

我似乎对 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

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

干杯,

马丁

【问题讨论】:

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


    【解决方案1】:

    失败: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 功能的模型库(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),应该可以在 libstdc++ 中实现完整的 C++ 语言环境支持。不幸的是,还没有人这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多