Як увімкнути C ++ 11 в gcc?


117

Я використовую 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.

Особисто я пішов із службою автоматизації для компіляції за допомогою таких прапорів. Makefiles також хороші, і, звичайно, є XCode (або будь-який інший IDE).
Дейв

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

Відповіді:


90

H2CO3 правильно, ви можете використовувати makefile з набором 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-файли знаходяться в одному каталозі, що і makefile. Але ви можете легко налаштувати свій makefile для підтримки src, включати та створювати каталоги.

Редагувати : я змінив компілятор c ++ за замовчуванням, моя версія g ++ не оновлена. З clang ++ цей makefile працює чудово.


дякую Silouane та @ H2CO3 :) я повинен навчитися працювати з makefiles
Guddu

1
@guddu: Ось підручник, який здається досить повним вступом. Тоді ви можете перевірити спеціальні макроси
Silouane Gerin

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> / специфікації

Я впевнений, що ви могли б зробити те ж саме без збірки 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як описано у відповіді (потрібно судо, щоб перемістити його туди під Linux) і працює як шарм! Дякую.
Адріан Ш

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.