繁体   English   中英

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

[英]C++ Error “failure: locale::facet::_S_create_c_locale name not valid” when running program from command line

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

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

干杯,

马丁

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

这种失败在非GNU平台上是典型的,其中GCC没有足够好的语言环境支持。 请参阅手册和--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 ),这使得在libstdc ++中实现完整的C ++语言环境支持成为可能。 不幸的是,还没有人做过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM