Kompilasi C ++ 11 dengan g ++


367

Saya mencoba memperbarui kompiler C ++ saya ke C ++ 11. Saya telah mencari sedikit dan saya sampai pada kesimpulan bahwa saya harus menggunakan bendera -std=c++0xatau -std=gnu++0x, tetapi saya tidak tahu banyak hal tentang bendera. Ada yang bisa bantu saya? (Saya menggunakan Ubuntu 12.04.)

Berikut adalah kesalahan yang saya dapatkan dari kompiler ketika saya mencoba menggunakan pustaka yang termasuk dalam C ++ 11 (yaitu array):

#include <array>
#include <iostream>

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

File ini membutuhkan dukungan kompiler dan pustaka untuk standar ISO C ++ mendatang, C ++ 0x. Dukungan ini saat ini bersifat percobaan, dan harus diaktifkan dengan opsi -std = c ++ 0x atau -std = gnu ++ 0x.


5
Di versi terbaru, Anda mungkin harus menggunakannya -std=c++11. Mungkin keduanya diizinkan.

6
Ini merindukan banyak konteks. Perlihatkan perintah lengkap yang telah Anda coba (mungkin bahkan kode sampel yang Anda coba kompilasi), dan apa yang sebenarnya gagal.
KillianDS

4
@classdaknok_t: keduanya harus diizinkan, juga ubuntu 12,04 dikirimkan g++-4.6secara default (yang hanya mendukung -std=c++0x)
KillianDS

3
Tambahkan flag setelahnya g++, mis g++ -std=c++0x _filename_ && ./a.out.
n. 'kata ganti' m.

1
Datang melintasi pos ini, mencari pesan kesalahan berjudul. Saya sedang mengerjakan proyek QMAKE, solusi bagi saya adalah menambahkan CONFIG + = c ++ 11 ke file .pro.

Jawaban:


529

Flags (atau opsi-opsi kompiler) tidak lain adalah argumen-argumen command line biasa yang diteruskan ke compiler yang dapat dieksekusi.

Dengan asumsi Anda memanggil g ++ dari baris perintah (terminal):

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

atau

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

jika hal di atas tidak berhasil.


8
Jangan lupa untuk memasukkannya -Wall -gsetelahnyag++
Basile Starynkevitch

7
@ BasileStarynkevitch: Saya akan menambahkan -Werrorjuga, tidak ada alasan untuk tidak memulai proyek.
Matthieu M.

3
Dukungan C ++ 11 yang lebih baik masih bisa diperdebatkan dan diagnostik yang lebih baik tidak terlihat jauh lebih baik hari ini (halaman Clang menggambarkan mereka menggunakan GCC 4.2 yang kuno) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely

58
Adakah yang tahu apakah / kapan kompiler C ++ akan mendukung standar C ++ 11 secara default, yaitu tanpa flag?
Dennis

2
Dan jika Anda belum tahu, dalam Visual C ++ cukup gunakan VC11 (Visual Studio 2012) atau lebih tinggi untuk memiliki fitur C ++ 11
gerrytan

44

Anda dapat memeriksa g++dengan perintah Anda:

which g++
g++ --version

ini akan memberi tahu Anda apa yang sedang dikompilasi.

Untuk beralih ke g++4.7 (dengan asumsi bahwa Anda telah menginstalnya di mesin Anda), jalankan:

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

Kemudian pilih 2sebagai pilihan (Mesin saya sudah menunjuk ke g++4.7, jadi *)

Setelah Anda mengganti kompiler, sekali lagi jalankan g++ --versionuntuk memeriksa bahwa pergantian telah terjadi dengan benar.

Sekarang kompilasi program Anda dengan

g++ -std=c++11 your_file.cpp -o main

Mungkin perlu disebutkan bahwa versi seperti g ++ 4.4 mungkin terlalu tua untuk melakukan beberapa fitur, sehingga diperlukan peningkatan. Peningkatan akan tergantung pada sistem Anda, dan saya akan menghindari metode kompilasi g ++ sendiri dan mengganti kompiler sistem untuk referensi
Colin D

13

Ubuntu Anda pasti memiliki versi g ++ yang cukup baru. Bendera yang digunakan adalah -std=c++0x.


Bagaimana Anda bisa mengatakan itu, ia menggunakan ubuntu? Hanya ingin tahu.
Shravan40

22
@ Shravan40 OP secara eksplisit mengatakan I'm using Ubuntu 12.04.dalam pertanyaan itu.
Timothy Gu

10

Jika Anda ingin mempertahankan ekstensi kompiler GNU, gunakan -std = gnu ++ 0x daripada -std = c ++ 0x. Berikut kutipan dari halaman manual:

Kompiler dapat menerima beberapa standar dasar, seperti c89 atau c ++ 98, dan dialek GNU dari standar tersebut, seperti gnu89 atau gnu ++ 98. Dengan menentukan standar dasar, kompiler akan menerima semua program mengikuti standar itu dan mereka yang menggunakan ekstensi GNU yang tidak bertentangan dengannya. Misalnya, -std = c89 mematikan fitur GCC tertentu yang tidak kompatibel dengan ISO C90, seperti kata kunci "asm" dan "typeof", tetapi tidak ekstensi GNU lain yang tidak memiliki arti dalam ISO C90, seperti menghilangkan istilah tengah ekspresi "?:". Di sisi lain, dengan menentukan dialek GNU dari suatu standar, semua fitur yang didukung oleh kompiler diaktifkan, bahkan ketika fitur-fitur itu mengubah arti dari standar dasar dan beberapa program yang sesuai mungkin dapat ditolak. Standar khusus digunakan oleh -pedantic untuk mengidentifikasi fitur mana yang merupakan ekstensi GNU mengingat versi standar tersebut. Misalnya-std = gnu89 -pedantic akan memperingatkan tentang gaya C ++ // komentar, sedangkan -std = gnu99 -pedantic tidak akan.


Dan apa yang membuat Anda, selain dari ?:operator biner ? Satu-satunya ekstensi lain yang muncul dalam pikiran, ekspresi struktur, digantikan oleh inisialisasi daftar C ++ 11. Bagaimanapun, kutipan ini terutama berkaitan dengan C, bukan C ++.
Potatoswatter

9

Anda dapat merujuk ke tautan berikut yang fitur-fiturnya didukung dalam versi kompiler tertentu. Ini memiliki daftar lengkap fitur dukungan di kompiler. Tampak GCC mengikuti standar erat dan mengimplementasikan sebelum kompiler lain.

Mengenai pertanyaan Anda, Anda dapat mengkompilasi menggunakan

  1. g++ -std=c++11 untuk C ++ 11
  2. g++ -std=c++14 untuk C ++ 14
  3. g++ -std=c++17 untuk C ++ 17
  4. g++ -std=c++2auntuk C ++ 20, meskipun semua fitur C ++ 20 belum didukung lihat tautan ini untuk daftar dukungan fitur di GCC.

Daftar ini berubah cukup cepat, perhatikan daftar tersebut, jika Anda menunggu fitur tertentu untuk didukung.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.