Bagaimana cara mengaktifkan C ++ 11 di gcc?

117

Saya menggunakan gcc 4.8.1 dari http://hpc.sourceforge.net di Mac OSX Mountain Lion. Saya mencoba untuk mengkompilasi program C ++ yang menggunakan to_stringfungsi di <string>. Saya perlu menggunakan bendera -std=c++11setiap saat:

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

Apakah ada cara untuk menyertakan tanda ini secara default?

Guddu
sumber
3
Gunakan Makefile dan masukkan CXXFLAGS.
Secara pribadi saya menggunakan layanan automator untuk mengkompilasi menggunakan flag seperti ini. Makefile juga bagus, dan tentu saja ada XCode (atau IDE lainnya).
Dave
Dev-C ++ dan IDE lainnya memiliki opsi compiler di mana Anda dapat mengaturnya
boctulus

Jawaban:

90

H2CO3 benar, Anda dapat menggunakan makefile dengan set CXXFLAGS dengan -std = c ++ 11 Makefile adalah file teks sederhana dengan instruksi tentang bagaimana mengkompilasi program Anda. Buat file baru bernama Makefile (dengan huruf besar M). Untuk secara otomatis mengkompilasi kode Anda cukup ketikkan perintah make di terminal. Anda mungkin harus menginstal make.

Ini yang sederhana:

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)

Ini mengasumsikan bahwa semua file .cpp berada di direktori yang sama dengan makefile tersebut. Tetapi Anda dapat dengan mudah mengubah makefile Anda untuk mendukung src, include dan build direktori.

Edit : Saya memodifikasi compiler c ++ default, versi g ++ saya tidak up-to-date. Dengan clang ++, makefile ini berfungsi dengan baik.

Silouane Gerin
sumber
terima kasih Silouane dan @ H2CO3 :) saya harus belajar bekerja dengan makefiles
Guddu
1
@guddu: Berikut tutorial yang tampaknya merupakan pengantar yang agak lengkap. Maka Anda mungkin ingin memeriksa makro khusus
Silouane Gerin
1
Perlu dicatat bahwa sintaks Makefile standar memerlukan karakter tab, atau itu akan memberikan kesalahan yang samar dan konyol. Itulah mengapa saya menggunakan gmake dengan RECIPEPREFIX seperti yang ditunjukkan dalam dokumentasi . Karakter tab adalah kekejian; gunakan mereka tidak pernah.
Parthian Shot
24

Seperti yang disebutkan sebelumnya - dalam kasus proyek, Makefileatau sebaliknya, ini adalah masalah konfigurasi proyek, di mana Anda mungkin perlu menentukan tanda lain juga.

Tapi bagaimana dengan program satu kali, di mana Anda biasanya hanya menulis g++ file.cpp && ./a.out?

Yah, saya ingin mengaktifkan beberapa #pragmadi tingkat sumber, atau mungkin ekstensi default - katakan .cxxatau .C11atau apa pun, picu secara default. Namun hingga hari ini, fitur tersebut belum ada.

Tetapi, karena Anda mungkin bekerja di lingkungan manual (yaitu shell), Anda dapat memiliki alias di dalam diri Anda .bashrc(atau apa pun):

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

atau, untuk G ++ yang lebih baru (dan saat Anda ingin merasakan "C ++ 11 yang sebenarnya")

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

Anda bahkan dapat membuat alias g++sendiri, jika Anda sangat membenci C ++ 03;)

Tomasz Gandor
sumber
7

Saya pikir Anda bisa melakukannya dengan menggunakan file spesifikasi.

Di bawah MinGW, Anda dapat menjalankan
gcc -dumpspecs> specs

Dimana dikatakan

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

Anda mengubahnya menjadi

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

Dan kemudian letakkan di
/ mingw / lib / gcc / mingw32 / <version> / specs

Saya yakin Anda dapat melakukan hal yang sama tanpa build MinGW. Tidak yakin di mana harus menempatkan file spesifikasi.

Folder tersebut kemungkinan adalah / gcc / lib / atau / gcc /.

MengantukSaturn
sumber
1
Saat ini, lebih mudah untuk mendapatkan build dari gcc-6, dengan default-nya adalah C ++ 14.
Marc Glisse
Di Linux, Anda dapat menemukan lokasi dengan menjalankan strace -f gcc your-sources-here 2>&1 | grep specs. Pada satu sistem Debian (lama), ini menghasilkan /usr/lib/gcc/i586-linux-gnu/4.9/specs. Dibuat specsseperti yang dijelaskan dalam jawaban (perlu sudo untuk memindahkannya ke sana di Linux) dan berfungsi seperti pesona! Terima kasih.
Adrian W
0

Jika Anda menggunakan sublime maka kode ini dapat berfungsi jika Anda menambahkannya dalam build sebagai kode untuk membangun sistem. Anda dapat menggunakan tautan ini untuk informasi lebih lanjut.

{
    "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}\""
        }
    ]
}
Abhilash Kumar Trivedi
sumber