当前位置:  开发笔记 > 编程语言 > 正文

使用LANG = en_US.UTF-8在MacOS 10.6上执行std :: locale breakage

如何解决《使用LANG=en_US.UTF-8在MacOS10.6上执行std::localebreakage》经验,为你挑选了2个好方法。

我有一个C++应用程序,我移植到MacOSX(特别是,10.6).该应用程序大量使用C++标准库和提升.我最近在应用程序中观察到一些我很难理解的破损.

基本上,boost文件系统库在程序运行时抛出运行时异常.通过一些调试和谷歌搜索,我将违规调用减少到以下最小程序:

#include 

int main ( int argc, char *argv [] ) {
    std::locale::global(std::locale(""));
    return 0;
}

当我通过g ++运行并在LANG=en_US.UTF-8设置的环境中执行生成的程序时,此程序失败(当我创建新的控制台窗口时,我的计算机上的程序是默认bash会话的一部分).清除环境变量(setenv LANG=)允许程序无问题地运行.但我很惊讶我在默认配置中看到了这种破坏.

我的问题是:

    这是MacOS 10.6上此代码的预期行为吗?

    什么是正确的解决方法?我无法真正重写函数,因为我们使用的boost库的版本在内部执行此语句作为文件系统库的一部分.

为了完整起见,我应该指出,通过'open'命令(或从Finder)启动时,合成此代码的程序会崩溃,但是当Xcode在调试模式下运行程序时则不会崩溃.

编辑 10.6.1上面代码给出的错误是:

$ ./locale 
terminate called after throwing an instance of 'std::runtime_error'
  what():  locale::facet::_S_create_c_locale name not valid
Abort trap

quark.. 9

好的,我没有给你答案,但我有一些线索:

这不仅限于OS X 10.6.我在10.4机器上得到了相同的结果.

我查看了libstdc ++的GCC源代码并寻找_S_create_c_locale.我发现的是在config/locale/generic/c_locale.cc的第143行.那里的评论说:"目前,通用模型只支持"C"语言环境." 这没有前途.事实上,如果我这样做LANG=C,运行时错误就会消失,但是我尝试的任何其他值LANG都会导致相同的错误,无论我给locale构造函数提供什么参数.(我试过locale::classic(),"C",""和默认值).这可以追溯到GCC 4.0

同一页面引用了关于此主题的libstdc ++邮件列表讨论.我不知道它有多么富有成效:我只是稍微关注它,它的技术非常快.

这些都没有告诉您为什么10.6上的默认语言环境不起作用,std::locale但它确实提出了一种解决方法,即LANG=C在运行程序之前设置.



1> quark..:

好的,我没有给你答案,但我有一些线索:

这不仅限于OS X 10.6.我在10.4机器上得到了相同的结果.

我查看了libstdc ++的GCC源代码并寻找_S_create_c_locale.我发现的是在config/locale/generic/c_locale.cc的第143行.那里的评论说:"目前,通用模型只支持"C"语言环境." 这没有前途.事实上,如果我这样做LANG=C,运行时错误就会消失,但是我尝试的任何其他值LANG都会导致相同的错误,无论我给locale构造函数提供什么参数.(我试过locale::classic(),"C",""和默认值).这可以追溯到GCC 4.0

同一页面引用了关于此主题的libstdc ++邮件列表讨论.我不知道它有多么富有成效:我只是稍微关注它,它的技术非常快.

这些都没有告诉您为什么10.6上的默认语言环境不起作用,std::locale但它确实提出了一种解决方法,即LANG=C在运行程序之前设置.



2> Laryx Decidu..:

我最近在Ubuntu 14.04 LTS和运行最新Raspbian Wheezy的Raspberry Pi上遇到过这个问题.

它与OS X无关,而是与G ++和Boost(至少高达V1.55)的组合以及某些平台上的默认语言环境设置.有一些与此问题相关的Boost错误故障单,请参阅故障单#4688和故障 单#5928.

我的"解决方案"是第一个做一些额外的语言环境设置,正如这个AskUbuntu发布的建议:

sudo locale-gen en_US en_US.UTF-8
sudo dpkg-reconfigure locales

但是,我还必须确保将环境变量LC_ALL设置为值LANG(建议将其放入您的.profile):

export LC_ALL=$LANG

在我的情况下,我使用语言环境en_US.UTF-8.

最后的评论:OP说"当我通过g ++运行时,这个程序失败了".我知道这个线程是在2009年开始的,但今天绝对没有必要在Mac上使用GCC或G ++,Apple免费提供更好的LLVM/Clang编译器套件,请参阅XCode主页.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有