我有一个C++应用程序,我移植到MacOSX(特别是,10.6).该应用程序大量使用C++标准库和提升.我最近在应用程序中观察到一些我很难理解的破损.
基本上,boost文件系统库在程序运行时抛出运行时异常.通过一些调试和谷歌搜索,我将违规调用减少到以下最小程序:
#includeint 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
在运行程序之前设置.
好的,我没有给你答案,但我有一些线索:
这不仅限于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
在运行程序之前设置.
我最近在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主页.