Компиляция C ++ 11 с g ++


368

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

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

#include <array>
#include <iostream>

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

Этот файл требует поддержки компилятора и библиотеки для следующего стандарта ISO C ++, C ++ 0x. Эта поддержка в настоящее время является экспериментальной и должна быть включена с помощью параметров компилятора -std = c ++ 0x или -std = gnu ++ 0x.


5
В последней версии вы, вероятно, должны использовать -std=c++11вместо этого. Может быть, и то и другое разрешено.

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

4
@classdaknok_t: оба должны быть разрешены, также ubuntu 12.04 поставляется g++-4.6по умолчанию (который поддерживает только -std=c++0x)
KillianDS

3
Добавьте флаги сразу после g++, например g++ -std=c++0x _filename_ && ./a.out.
нет. местоимения м.

1
Наткнулся на это сообщение, ища озаглавленное сообщение об ошибке. Я работаю над проектом QMAKE, решением для меня было добавление CONFIG + = c ++ 11 в файл .pro.

Ответы:


529

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

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

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

или

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

если вышеупомянутое не работает.


8
Не забудьте поставить -Wall -gсразу послеg++
Василий Старынкевич

7
@BasileStarynkevitch: я бы -Werrorтоже добавил , без причины не при запуске проекта.
Матье М.

3
Лучшая поддержка C ++ 11 спорна, и лучшая диагностика в наши дни выглядит не намного лучше (страница Клэнга, описывающая их, использует GCC 4.2, который является древним) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Джонатан Уэйкли

58
Кто-нибудь знает, если / когда компиляторы C ++ будут поддерживать стандарт C ++ 11 по умолчанию, то есть без флага?
Деннис

2
И если вы еще не знаете, в Visual C ++ просто используйте VC11 (Visual Studio 2012) или выше, чтобы иметь функции C ++ 11
gerrytan

44

Вы можете проверить свой 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

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

13

Ваша Ubuntu определенно имеет достаточно свежую версию g ++. Флаг для использования есть -std=c++0x.


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

22
@ Shravan40 OP прямо говорит I'm using Ubuntu 12.04.в вопросе.
Тимоти Гу

10

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

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


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

9

Вы можете обратиться к следующей ссылке, для которой функции поддерживаются в конкретной версии компилятора. Он имеет исчерпывающий список поддержки функций в компиляторе. Похоже, GCC внимательно следит за стандартом и реализует перед любым другим компилятором.

Что касается вашего вопроса, вы можете скомпилировать с помощью

  1. g++ -std=c++11 для C ++ 11
  2. g++ -std=c++14 для C ++ 14
  3. g++ -std=c++17 для C ++ 17
  4. g++ -std=c++2aдля C ++ 20, хотя все функции C ++ 20 еще не поддерживаются, обратитесь к этой ссылке для получения списка поддержки функций в GCC.

Список меняется довольно быстро, следите за списком, если вы ожидаете поддержки определенной функции.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.