Gcc'de C ++ 11'i nasıl etkinleştiririm?


119

Mac OSX Mountain Lion'da http://hpc.sourceforge.net adresinden gcc 4.8.1 kullanıyorum . İçinde to_stringişlevini kullanan bir C ++ programı derlemeye çalışıyorum <string>. Bayrağı -std=c++11her seferinde kullanmam gerekiyor :

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

Bu bayrağı varsayılan olarak eklemenin bir yolu var mı?


3
Makefile kullanın ve içine koyun CXXFLAGS.

Şahsen, bunun gibi bayraklar kullanarak derlemek için bir otomatöre gittim. Makefile'lar da iyidir ve tabii ki XCode (veya başka bir IDE) vardır.
Dave

Dev-C ++ ve diğer
IDE'ler

Yanıtlar:


91

H2CO3 haklı, -std = c ++ 11 ile CXXFLAGS setiyle bir makefile kullanabilirsiniz. Makefile, programınızı nasıl derleyeceğiniz hakkında talimatlar içeren basit bir metin dosyasıdır. Makefile (büyük M ile) adlı yeni bir dosya oluşturun. Kodunuzu otomatik olarak derlemek için make terminalde komutunu yeterlidir. Make'i yüklemeniz gerekebilir.

İşte basit bir tane:

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)

Tüm .cpp dosyalarının makefile ile aynı dizinde olduğunu varsayar. Ancak, bir src'yi desteklemek, dizinleri dahil etmek ve oluşturmak için makefile'ınızı kolayca değiştirebilirsiniz.

Düzenleme : Varsayılan c ++ derleyicisini değiştirdim, g ++ sürümüm güncel değil. Clang ++ ile bu makefile sorunsuz çalışıyor.


teşekkürler Silouane ve @ H2CO3 :) makefiles ile çalışmayı öğrenmeliyim
Guddu

1
@guddu: İşte oldukça eksiksiz bir giriş gibi görünen bir öğretici . Öyleyse özel makroları
Silouane Gerin 21

1
Standart Makefile sözdiziminin sekme karakterleri gerektirdiğini veya şifreli, aptalca hatalar vereceğini belirtmek gerekir. Bu nedenle , belgelerde gösterildiği gibi RECIPEPREFIX ile gmake kullanıyorum . Sekme karakterleri iğrençtir; onları asla kullanmayın.
Parthian Shot

24

Daha önce belirtildiği gibi - bir proje Makefileveya başka bir durumda , bu, muhtemelen diğer bayrakları da belirtmeniz gerekeceği bir proje yapılandırma sorunudur.

Peki ya normalde nerede yazarsınız tek seferlik programlar g++ file.cpp && ./a.out?

Pekala, bazılarının #pragmakaynak düzeyinde veya belki varsayılan bir uzantıya açılmasını çok isterim - örneğin .cxxya .C11da her neyse, varsayılan olarak tetikleyin. Ama bugün itibariyle böyle bir özellik yok.

Ancak, muhtemelen manuel bir ortamda (yani kabuk) çalıştığınız için, yalnızca bir takma adınız olabilir .bashrc(veya her neyse):

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

veya daha yeni G ++ için (ve "gerçek C ++ 11" hissetmek istediğinizde)

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

Hatta g++C ++ 03'ten bu kadar nefret ediyorsanız, takma ad da verebilirsiniz ;)


7

Bunu bir özellik dosyası kullanarak yapabileceğinizi düşünüyorum.

MinGW altında
gcc -dumpspecs> specs komutunu çalıştırabilirsiniz.

Nerede söylüyor

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

Sen değiştir

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

Ve sonra
/ mingw / lib / gcc / mingw32 / <version> / specs içine yerleştirin

Eminim bir MinGW yapısı olmadan da aynısını yapabilirsiniz. Yine de özellikler dosyasını nereye yerleştireceğinizden emin değilim.

Klasör muhtemelen / gcc / lib / veya / gcc / şeklindedir.


1
Bu noktada, varsayılanın C ++ 14 olduğu bir gcc-6 derlemesini elde etmek daha kolaydır.
Marc Glisse

Linux altında konumu çalıştırarak bulabilirsiniz strace -f gcc your-sources-here 2>&1 | grep specs. Bir (eski) Debian sisteminde bu sonuç verir /usr/lib/gcc/i586-linux-gnu/4.9/specs. Bunu specscevapta açıklandığı gibi yarattı (Linux altında oraya taşımak için sudo gerekiyor) ve bir cazibe gibi çalışıyor! Teşekkürler.
Adrian W

0

Sublime kullanıyorsanız, bu kod, yapı sistemi için kod olarak yapıya eklerseniz işe yarayabilir. Daha fazla bilgi için bu bağlantıyı kullanabilirsiniz .

{
    "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}\""
        }
    ]
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.