使用C ++ 11和NaCl / PNaCl

时间:2013-12-05 10:10:03

标签: c++11 google-nativeclient

我想要测试NaCl和PNaCl(接下来,我将使用NaCL)和默认的SDK和Pepper_31。

https://developers.google.com/native-client/dev/

我尝试改编旧项目,但这个项目使用C ++ 11。我向CFLAGS添加了此选项-std = c ++ 11,但此选项无法识别。

cc1plus:错误:无法识别的命令行选项“-std = c ++ 11”

正常,NaCl支持C ++ 11,但也许我不明白这一章。

https://developers.google.com/native-client/dev/reference/pnacl-c-cpp-language-support#source-language-support

在使用带有NaCL的C ++ 11进行一些研究之后,一个解决方案用于CFLAGS这个选项-std = c ++ 0x -D__GXX_EXPERIMENTAL_CXX0X __ = 1.

但是C ++ 11不是完全支持的,我有很多错误(这段代码适用于GCC 4.7.2,-std = C ++ 11选项)。

我的问题是:

1)NaCl是否真的支持C ++ 11?

2)如果是,如何使用NaCl启用C ++ 11?

3)否则,这种支持将很快发布(可能是Pepper_32)?

4)你有别人解决了吗?

感谢您的关注。

编辑: 当我使用默认工具链编译-std = c ++ 0x -D__GXX_EXPERIMENTAL_CXX0X __ = 1作为选项时,会导致此错误:

src / GEP_PARSE / ParserCSV.cpp:在函数'void csvWriteFile(std :: vector,std :: allocator>,std :: allocator,std :: allocator>>&gt ;,std :: allocator,std)中:: allocator>,std :: allocator,std :: allocator>>>>>&,const std :: string&,char)':

src / GEP_PARSE / ParserCSV.cpp:16:错误:':'令牌之前的预期初始值设定项 src / GEP_PARSE / ParserCSV.cpp:24:错误:'}'令牌之前的预期primary-expression src / GEP_PARSE / ParserCSV.cpp:24:错误:预期';'在'}'标记之前 src / GEP_PARSE / ParserCSV.cpp:24:错误:'}'令牌之前的预期primary-expression src / GEP_PARSE / ParserCSV.cpp:24:错误:预期')'在'}'令牌之前 src / GEP_PARSE / ParserCSV.cpp:24:错误:'}'令牌之前的预期primary-expression src / GEP_PARSE / ParserCSV.cpp:24:错误:预期';'在'}'标记之前

Makefile:24:目标'newlib / Release / src / GEP_PARSE / ParserCSV_x86_32.o'的配方失败 make: * [newlib / Release / src / GEP_PARSE / ParserCSV_x86_32.o]错误1

代码来源: for(自动行:记录) { ... }

2 个答案:

答案 0 :(得分:3)

正如您所发现的那样,x86 NaCl编译器太旧了,无法完全支持C ++ 11:

$ pwd
/home/binji/dev/testsdk/nacl_sdk/pepper_31/toolchain/linux_x86_newlib/x86_64-nacl/bin

$ ./gcc --version
gcc (GCC) 4.4.3 20130827 (Native Client r12067, Git Commit 46c2b9f0e51c734569cdd6956af695881814e7ed)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

您可以将其与此页面进行比较,以查看哪些功能缺失:http://gcc.gnu.org/projects/cxx0x.html

PNaCl编译器支持C ++ 11:https://developers.google.com/native-client/dev/reference/pnacl-c-cpp-language-support

您可以使用pnacl-translate工具将.pexe转换为特定于体系结构的.nexe。

请注意,目前PNaCl使用GCC的libstdc ++,而不是LLVM的libc ++,尽管这应该很快修复。请在此处查看最近的帖子:https://groups.google.com/d/msg/native-client-discuss/WxRAMOO_6iE/TJw6O9JtIUsJ

答案 1 :(得分:0)

使用SDK版本: pepper_49

添加更多信息以便进一步搜索用户&也可以回答这篇文章:

  • 建议在邮件列表中阅读this thread
  • 尝试为-std=gnu++11(而不是CFLAGS)添加-std=c++11选项 (张华在上面的帖子中回答)

<强>扩展

道歉没有详尽地测试C ++ 11中的每个功能,我可以使用 auto 基于范围的for-loop 初始化列表使用此选项。

标准库

至于C ++ 11标准库,即使没有这个额外的选项,它的大多数也可以正常工作。但是,目前还不支持某些类/函数(例如 packaged_task async bind )。添加此选项应该有效。