【问题标题】:Does Google NaCl support exceptions with a C++ 11 compiler?Google NaCl 是否支持 C++ 11 编译器的异常?
【发布时间】:2013-05-31 15:36:21
【问题描述】:

Google NaCL 至少带有两个 C++ 编译器:一个非常旧的 gcc 版本和一个非常新的 clang 版本。 gcc 版本不支持 C++ 11,所以我宁愿不使用它。非常新的 clang 编译器生成中间代码,然后在浏览器中编译,或者将其编译为本机。我尝试了第一种方法:让 Chrome 在浏览器中编译它。问题:异常不起作用,我需要它们。我查了this,但我实在看不懂这张票的细则。这留下了第二种方法:在部署之前将代码编译为本机......问题:那么我可以使用异常吗?还是我应该放弃任何希望?

(...在 Go 和这个之后,我的印象是 Google 工程师真的讨厌异常...)

【问题讨论】:

标签: c++ c++11 google-nativeclient


【解决方案1】:

在最新版本的 PNaCl 工具链中,您可以通过在链接时传递选项 --pnacl-exceptions=sjlj 来启用 C++ 异常处理。生成的 pexe 可以在任何支持 PNaCl(Chrome 31 及更高版本)的 Chrome 版本中运行。

此选项将 try/catch 块转换为在内部使用 setjmp()。性能可能不是很好。我们计划稍后添加对零成本异常处理的 ABI 稳定支持以提高性能。

此选项最终应在适用于 Chrome 33 的 NaCl SDK 中可用。在此之前,它在 NaCl SDK 的 Canary 版本中可用。

【讨论】:

  • 越来越好了!很高兴知道!
【解决方案2】:

你链接到的票的本质是

  • 你不能在 PNaCl 中使用 C++ 异常,也就是说,如果你打算部署为 .pexe 文件(LLVM 位码),你不能使用 C++ 异常,但是

  • 如果您提供标志 --pnacl-allow-exceptions(对 两者 pnacl-clang 和 pnacl-translate)并一路编译和翻译,则可以在基于 Clang 的工具链中使用 C++ 异常部署前到一组.nexe 二进制文件。

在 C++ 以及几乎任何其他语言中,应谨慎使用异常,正如您在上面看到的,一些样式指南建议根本不要使用它们。

【讨论】:

  • 感谢您的回答。我没有让这个选项起作用:在翻译时(现在,在浏览器之外)我得到了对 _Unwind 的未定义引用......知道如何处理这些吗?
  • 您需要将 --pnacl-allow-exceptions 传递给 pnacl-translate 以及 pnacl-clang。
【解决方案3】:
  • 如果您计划部署 .nexe,则可以将 C++ 异常与 PNaCl 工具链一起使用。

    链接 .pexe 时需要将 --pnacl-allow-exceptions 传递给 pnacl-clang,将 .pexe 转换为 .nexe 时需要传递给 pnacl-translate。

    如果您不将此选项传递给 pnacl-translate,您将收到有关 _Unwind_* 符号未解析的错误。如果在链接.pexe时不传递该选项,抛出异常会导致程序退出。

  • 当 .pexe 在 PNaCl 的第一个版本中由浏览器翻译时,将不支持 C++ 异常。如上,抛出异常会导致程序退出。但以后的版本将支持 C++ 异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多