Как включить C ++ 11 в gcc?


119

Я использую gcc 4.8.1 с http://hpc.sourceforge.net на Mac OSX Mountain Lion. Я пытаюсь скомпилировать программу на C ++, которая использует to_stringфункцию в <string>. Мне нужно использовать флаг -std=c++11каждый раз:

g++ -std=c++11 -o testcode1 code1.cpp

Есть ли способ включить этот флаг по умолчанию?


3
Используйте Makefile и вставьте его CXXFLAGS.

Лично я использовал сервис-автомат для компиляции с использованием подобных флагов. Make-файлы тоже хороши, и, конечно же, есть XCode (или любая другая IDE).
Дэйв

Dev-C ++ и другие IDE имеют параметры компилятора, в которых вы можете их установить
boctulus

Ответы:


91

H2CO3 прав, вы можете использовать make-файл с CXXFLAGS, установленным с -std = c ++ 11 Makefile - это простой текстовый файл с инструкциями о том, как скомпилировать вашу программу. Создайте новый файл с именем Makefile (с заглавной буквы M). Чтобы автоматически скомпилировать код, просто введите команду make в терминале. Возможно, вам придется установить make.

Вот простой:

CXX=clang++
CXXFLAGS=-g -std=c++11 -Wall -pedantic
BIN=prog

SRC=$(wildcard *.cpp)
OBJ=$(SRC:%.cpp=%.o)

all: $(OBJ)
    $(CXX) -o $(BIN) $^

%.o: %.c
    $(CXX) $@ -c $<

clean:
    rm -f *.o
    rm $(BIN)

Предполагается, что все файлы .cpp находятся в том же каталоге, что и make-файл. Но вы можете легко настроить свой make-файл для поддержки каталогов src, include и build.

Изменить : я изменил компилятор C ++ по умолчанию, моя версия g ++ устарела. С clang ++ этот make-файл работает нормально.


спасибо Silouane и @ H2CO3 :) я должен научиться работать с make-файлами
Guddu

1
@guddu: Вот руководство, которое кажется довольно полным введением. Тогда вы можете проверить специальные макросы
Силуан Герин

1
Стоит отметить, что стандартный синтаксис Makefile требует символов табуляции, иначе он выдаст загадочные идиотские ошибки. Вот почему я использую gmake с RECIPEPREFIX, как показано в документации . Табуляция - это мерзость; никогда не используйте их.
Парфянский выстрел

24

Как упоминалось ранее - в случае проекта, Makefile или в противном случае это проблема конфигурации проекта, где вам, вероятно, также потребуется указать другие флаги.

Но как насчет разовых программ, в которых вы обычно просто пишете g++ file.cpp && ./a.out ?

Что ж, я бы очень хотел, чтобы некоторые из них #pragmaбыли включены на уровне исходного кода, или, может быть, расширение по умолчанию - скажем .cxxили.C11 или независимо от того , вызвать его по умолчанию. Но на сегодняшний день такой функции нет.

Но, поскольку вы, вероятно, работаете в ручной среде (например, в оболочке), у вас может быть просто псевдоним .bashrc(или что-то еще):

alias g++11="g++ -std=c++0x"

или для более нового G ++ (и когда вы хотите почувствовать себя "настоящим C ++ 11")

alias g++11="g++ -std=c++11"

Вы даже можете присвоить g++себе псевдоним , если вы так сильно ненавидите C ++ 03;)


7

Я думаю, вы могли бы сделать это с помощью файла спецификаций.

Под MinGW вы можете запустить
gcc -dumpspecs> specs

Где говорится

*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT}

Вы измените его на

*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} -std=c++11

А затем поместите его в
/ mingw / lib / gcc / mingw32 / <version> / specs

Я уверен, что вы могли бы сделать то же самое без сборки MinGW. Не уверен, где разместить файл спецификаций.

Возможно, это / gcc / lib / или / gcc /.


1
На данный момент проще получить сборку gcc-6, где по умолчанию используется C ++ 14.
Марк Глисс

Под Linux вы можете найти местоположение, запустив strace -f gcc your-sources-here 2>&1 | grep specs. В одной (более старой) системе Debian это дает /usr/lib/gcc/i586-linux-gnu/4.9/specs. Создано, specsкак описано в ответе (требуется sudo, чтобы переместить его туда под Linux), и работает как шарм! Спасибо.
Adrian W

0

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

{
    "shell_cmd": "g++ \"${file}\" -std=c++1y -o \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "shell_cmd": "g++ \"${file}\" -std=c++1y -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
        }
    ]
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.