我似乎对 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
知道这里可能出了什么问题吗?
Cheers,
Martin
失败: locale::facet::_S_create_c_locale 名称无效
这种失败在非 GNU 平台上很常见,其中 GCC 没有足够好的语言环境支持。请参阅手册和--enable-clocale http://gcc.gnu.org/onlinedocs/libstdc++/manual/configure.htmllibstdc++ 选项描述如下:
选择特定于目标的底层语言环境包。选择“ieee_1003.1-2001”指定基于 langinfo/iconv/catgets 的 X/Open、标准 Unix (IEEE Std. 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(据我所知,我不拥有或无法访问 MacOS X Darwin),确实提供了足够的线程安全区域设置 API(xlocale https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/xlocale.3.html)这应该可以在 libstdc++ 中实现完整的 C++ 语言环境支持。不幸的是,目前还没有人做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)