fix*_*ark 16 c++ macos cocoa boost
我有一个C++应用程序,我移植到MacOSX(特别是,10.6).该应用程序大量使用C++标准库和提升.我最近在应用程序中观察到一些我很难理解的破损.
基本上,boost文件系统库在程序运行时抛出运行时异常.通过一些调试和谷歌搜索,我将违规调用减少到以下最小程序:
#include <locale>
int main ( int argc, char *argv [] ) {
std::locale::global(std::locale(""));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我通过g ++运行并在LANG=en_US.UTF-8设置的环境中执行生成的程序时,此程序失败(当我创建新的控制台窗口时,我的计算机上的程序是默认bash会话的一部分).清除环境变量(setenv LANG=)允许程序无问题地运行.但我很惊讶我在默认配置中看到了这种破坏.
我的问题是:
为了完整起见,我应该指出,通过'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
好的,我没有给你答案,但我有一些线索:
_S_create_c_locale.我发现的是在config/locale/generic/c_locale.cc的第143行.那里的评论说:"目前,通用模型只支持"C"语言环境." 这没有前途.事实上,如果我这样做LANG=C,运行时错误就会消失,但是我尝试的任何其他值LANG都会导致相同的错误,无论我给locale构造函数提供什么参数.(我试过locale::classic(),"C",""和默认值).这可以追溯到GCC 4.0这些都没有告诉您为什么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
Run Code Online (Sandbox Code Playgroud)
但是,我还必须确保将环境变量LC_ALL设置为值LANG(建议将其放入您的.profile):
export LC_ALL=$LANG
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我使用语言环境en_US.UTF-8.
最后的评论:OP说"当我通过g ++运行时,这个程序失败了".我知道这个线程是在2009年开始的,但今天绝对没有必要在Mac上使用GCC或G ++,Apple免费提供更好的LLVM/Clang编译器套件,请参阅XCode主页.
| 归档时间: |
|
| 查看次数: |
8436 次 |
| 最近记录: |