2012-04-28 3 views
258

Я пытаюсь обновить свой компилятор C++ до C++ 11. Я немного искал, и я пришел к выводу, что мне нужно использовать флаг -std=c++0x или -std=gnu++0x, но я не знаю много о флажках. Может кто-нибудь мне помочь? (Я использую Ubuntu 12.04.)Компиляция C++ 11 с g ++

Здесь ошибка, что я получаю от компилятора, когда я попытаться использовать библиотеку, которая включена в C++ 11 (т.е. массив):

#include <array> 
#include <iostream> 

int main() 
{ 
    std::array<int, 3> arr = {2, 3, 5}; 
    ... 
} 

This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

+0

Это зависит от того, что вы используете, чтобы построить. Makefile? Затмение? Что-то другое? – dutt

+3

В новейшей версии вам, вероятно, придется использовать '-std = C++ 11'. Возможно, оба разрешены. –

+6

Этому недостает большого контекста. Покажите полную команду, которую вы пробовали (возможно, даже образец кода, который вы пытались скомпилировать), и что на самом деле не удалось. – KillianDS

ответ

386

Флаги (или параметры компилятора) - это не что иное, как обычные аргументы командной строки, переданные исполняемому файлу компилятора.

Предполагая, что вы призываете г ++ из командной строки (терминала):

$ g++ -std=c++11 your_file.cpp -o your_program

или

$ g++ -std=c++0x your_file.cpp -o your_program

если выше не работает.

+6

Не забудьте поставить '-Wall -g' сразу после' g ++ ' –

+5

@BasileStarynkevitch: Я бы добавил' -Werror' тоже, без причины не при запуске проекта. –

+0

Это сработало! Большое спасибо! –

11

Ваш убунту определенно имеет достаточно последнюю версию g ++. Используемый флаг: -std=c++0x.

+0

Как вы можете сказать, что он использует ubuntu ?. Просто любопытно узнать. – Shravan40

+9

@ Shravan40 OP явно говорит «Я использую Ubuntu 12.04.' в вопросе. –

8

Если вы хотите сохранить расширения компилятора GNU, используйте -std = gnu ++ 0x, а не -std = C++ 0x. Вот цитата из человека страницы:

компилятор может принять несколько стандартов базовых, такие как C89 или C++ 98, и GNU диалекты этих стандартов, такие как gnu89 или гну ++ 98. К , указав базовый стандарт, компилятор примет все программы , следуя этому стандарту, и те, которые используют расширения GNU, которые не , противоречат ему. Например, -std = c89 отключает некоторые функции GCC , которые несовместимы с ISO C90, такие как ключевые слова «asm» и «typeof» , но не другие расширения GNU, которые не имеют значения в ISO C90, например, исключая средний термин выражения «?:». С другой стороны, с помощью ссылки на GNU-диалект стандарта все функции включены, даже если эти функции меняют значение базового стандарта , а некоторые программы строгого соответствия могут быть отклонены . Конкретный стандарт используется для -патентности для определения , функции которого являются расширениями GNU с учетом версии стандарта. Например, std = gnu89 -pedantic будет предупреждать о стиле C++ // комментариев, тогда как -std = gnu99 -pedantic не будет.

+0

И что это заставляет вас, кроме двоичного оператора??:? Единственное другое расширение, которое приходит на ум, выражает структуру, сверяется с инициализацией списка C++ 11. В любом случае эта цитата в основном относится к C, а не к C++. – Potatoswatter

39

Вы можете проверить ваш g++ командой:

which g++ 
g++ --version 

это покажет вам, какие компилятор в настоящее время он указывает.

Для перехода на g++ 4.7 (при условии, что вы установили его в машине), запустите:

sudo update-alternatives --config gcc 

There are 2 choices for the alternative gcc (providing /usr/bin/gcc). 

    Selection Path    Priority Status 
------------------------------------------------------------ 
    0   /usr/bin/gcc-4.6 60  auto mode 
    1   /usr/bin/gcc-4.6 60  manual mode 
* 2   /usr/bin/gcc-4.7 40  manual mode 

Затем выберите 2 как выделение (Моя машина уже указывает на g++ 4.7, так что *)

После переключения компилятором затем снова запустите g++ --version, чтобы проверить правильность переключения.

Теперь скомпилировать программу с

g++ -std=c++11 your_file.cpp -o main 
+0

Возможно, стоит упомянуть, что такие версии, как g ++ 4.4, могут быть слишком старыми, чтобы выполнять некоторые функции, поэтому необходима модернизация. Модернизация будет зависеть от вашей системы, и я бы избегал методов компиляции g ++ самостоятельно и замены компилятора системы для справки –