Используйте C++11 с NaCl/PNaCl

Я хочу протестировать 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

После некоторых исследований по использованию C++11 с NaCL, решение использовать CFLAGS для этих параметров -std=c++0x -D__GXX_EXPERIMENTAL_CXX0X__=1.

Но C++11 поддерживается не полностью, и у меня много ошибок (этот код работает с GCC 4.7.2 с опцией -std=C++11).

Мои вопросы:

1) Действительно ли NaCl поддерживает C++11?

2) Если да, как включить С++ 11 с NaCl?

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> > >, std::allocator, std::allocator >, std ::allocator, std::allocator > > > > >&, const std::string&, char)':

src/GEP_PARSE/ParserCSV.cpp:16: ошибка: ожидаемый инициализатор перед токеном ':' src/GEP_PARSE/ParserCSV.cpp:24: ошибка: ожидаемое первичное выражение перед токеном '}' src/GEP_PARSE/ParserCSV.cpp:24: ошибка: ожидается ';' до токена '}' src/GEP_PARSE/ParserCSV.cpp:24: ошибка: ожидаемое первичное выражение перед токеном '}' src/GEP_PARSE/ParserCSV.cpp:24: ошибка: ожидается ')' перед токеном '}' src/GEP_PARSE /ParserCSV.cpp:24: ошибка: ожидается первичное выражение перед токеном '}' src/GEP_PARSE/ParserCSV.cpp:24: ошибка: ожидается ';' перед токеном '}'

Makefile:24: рецепт для цели 'newlib/Release/src/GEP_PARSE/ParserCSV_x86_32.o' не удалось сделать: * [newlib/Release/src/GEP_PARSE/ParserCSV_x86_32.o] Ошибка 1

Источник кода: for(auto row:record) {...}


person vernou    schedule 05.12.2013    source источник
comment
Вы читали их сайт? цепочка инструментов PNaCl на основе Clang 3.3, который полностью поддерживает C++11. Так что единственный реальный вопрос 2) или какой-то другой, незаданный.   -  person cubuspl42    schedule 05.12.2013
comment
Вы также можете добавить несколько сообщений об ошибках.   -  person cubuspl42    schedule 05.12.2013
comment
Спасибо за ваши ответы. Написано C++11 поддерживается, но когда? Я отредактировал свой вопрос, чтобы добавить сообщения об ошибках.   -  person vernou    schedule 05.12.2013
comment
Они используют настоящее время, поэтому C++11 должен уже поддерживаться. Вы уверены, что используете новейшую версию их набора инструментов? Пожалуйста, опубликуйте несколько сообщений об ошибках, они могут быть полезны.   -  person cubuspl42    schedule 05.12.2013
comment
Так быстро, что нет времени редактировать сообщение. Последний релиз - перец_31 (я использую), следующий перец разрабатывается, но снова не стабилен. Я попробую использовать это.   -  person vernou    schedule 05.12.2013


Ответы (2)


Как вы обнаружили, компиляторы 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 использует libstdc++ GCC, а не libc++ LLVM, хотя вскоре это должно быть исправлено. См. недавнюю ветку здесь: https://groups.google.com/d/msg/native-client-discuss/WxRAMOO_6iE/TJw6O9JtIUsJ

person binji    schedule 05.12.2013
comment
Спасибо за ваши ответы. Но PNaCl использует LLVM, потому что он работает с этой опцией -D__GXX_EXPERIMENTAL_CXX0X__=1. Я думаю, что когда я нашел это, я забыл протестировать инструментарий PNaCl. - person vernou; 05.12.2013

Использование версии SDK: перец_49


Добавьте еще немного информации для дальнейшего поиска пользователей и, возможно, ответа на этот пост:

  • Предложите прочитать эту тему в их списке рассылки.
  • Попробуйте добавить параметр -std=gnu++11 для CFLAGS (вместо -std=c++11)
    (отвечает Хуа Чжан в теме выше)

Расширения

Приносим извинения за то, что не полностью протестировали каждую функцию в C++11, и я могу использовать auto, цикл на основе диапазона и список инициализации< /em> с этой опцией.

Стандартная библиотека

Что касается стандартной библиотеки C++11, то большая ее часть просто работает и без этой дополнительной опции. Однако некоторые классы/функции в настоящее время не поддерживаются должным образом (например, packaged_task, async, bind). Добавление этой опции должно работать.

person Arthur.Dou    schedule 22.03.2017