C ++ 11'i g ++ ile derleme


367

C ++ derleyicimi C ++ 11'e güncellemeye çalışıyorum. Biraz araştırdım ve bayrağı kullanmak zorunda olduğum -std=c++0xya da -std=gnu++0xbayraklar hakkında pek bir şey bilmediğim sonucuna vardım . Biri bana yardım edebilir mi? (Ubuntu 12.04 kullanıyorum.)

İşte C ++ 11 (yani dizi) bulunan bir kütüphane kullanmaya çalıştığınızda derleyici gelen hata:

#include <array>
#include <iostream>

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

Bu dosya, yaklaşan ISO C ++ standardı C ++ 0x için derleyici ve kütüphane desteği gerektirir. Bu destek şu anda deneyseldir ve -std = c ++ 0x veya -std = gnu ++ 0x derleyici seçenekleriyle etkinleştirilmelidir.


5
En yeni sürümde, muhtemelen -std=c++11bunun yerine kullanmanız gerekir . Belki ikisine de izin verilir.

6
Bu çok fazla bağlamı kaçırıyor. Denediğiniz tam komutu (hatta derlemeye çalıştığınız örnek kodu bile) ve gerçekten başarısız olanı gösterin.
KillianDS

4
@classdaknok_t: her ikisine de izin verilmeli, ayrıca g++-4.6varsayılan olarak 12.04 gemi ubuntu (sadece destekliyor -std=c++0x)
KillianDS

3
Hemen ardından bayrak ekleyin g++, örn g++ -std=c++0x _filename_ && ./a.out.
n. 'zamirler' m.

1
Başlıklı hata mesajı arama bu yazı geldi. Im bir QMAKE proje üzerinde çalışıyor, benim için çözüm .pro dosyasına CONFIG + = c ++ 11 ekliyordu.

Yanıtlar:


529

Bayraklar (veya derleyici seçenekleri), derleyici yürütülebilir dosyasına iletilen sıradan komut satırı bağımsız değişkenlerinden başka bir şey değildir.

Komut satırından (terminal) g ++ çağırdığınızı varsayarsak:

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

veya

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

yukarıdaki işe yaramazsa.


8
-Wall -gHemen g++
arkasına

7
@BasileStarynkevitch: Ben de eklerdim -Werror, bir projeye başlarken hiçbir neden eklemem .
Matthieu M.Nisan

3
Daha iyi C ++ 11 desteği tartışmalıdır ve daha iyi teşhisler bu günlerde çok daha iyi görünmüyor ( Clang'ın onları açıklayan sayfa eski GCC 4.2 kullanıyor) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely

58
C ++ derleyicilerinin varsayılan olarak C ++ 11 standardını destekleyip desteklemeyeceğini / ne zaman bayraksız destekleyeceğini bilen var mı?
Dennis

2
Ve henüz bilmiyorsanız, Visual C ++ 'da C ++ 11 özelliklerine sahip olmak için VC11 (Visual Studio 2012) veya üstünü kullanmanız yeterlidir
Gerrytan

44

g++Komutunuzu kullanarak kontrol edebilirsiniz :

which g++
g++ --version

bu size şu anda hangi karşılaştırıcının işaret ettiğini söyleyecektir.

g++4.7'ye geçmek için (makinenize kurduğunuzu varsayarak), çalıştırın:

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

Sonra seçim 2olarak seçin (Makinem zaten 4.7'yi gösteriyor g++, böylece *)

g++ --versionAnahtarlayıcı değiştirildikten sonra , anahtarlamanın doğru olup olmadığını kontrol etmek için tekrar çalıştırın .

Şimdi programınızı

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

G ++ 4.4 gibi sürümlerin bazı özellikleri yapmak için çok eski olabileceğinden bahsetmeye değer olabilir, bu nedenle yükseltme gereklidir. Yükseltme sisteminize bağlı olacaktır ve g ++ 'ı kendiniz derleme ve referans için sistemin derleyicisini değiştirme yöntemlerinden kaçınırım
Colin D

13

Ubuntu'nuz kesinlikle g ++ 'ın yeterince yeni bir sürümüne sahiptir. Kullanılacak bayrak -std=c++0x.


Bunu nasıl söyleyebilirsin, o Ubuntu kullanıyor mu? Sadece merak ediyorum.
Shravan40

22
@ Shravan40 OP soruda açıkça söylüyor I'm using Ubuntu 12.04..
Timothy Gu

10

GNU derleyici uzantılarını korumak istiyorsanız, -std = c ++ 0x yerine -std = gnu ++ 0x kullanın. Adam sayfasından bir alıntı:

Derleyici, c89 veya c ++ 98 gibi çeşitli temel standartları ve bu standartların GNU lehçelerini (gnu89 veya gnu ++ 98 gibi) kabul edebilir. Bir temel standart belirleyerek, derleyici bu standardı izleyen ve onunla çelişmeyen GNU uzantılarını kullanan tüm programları kabul edecektir. Örneğin, -std = c89, GCC'nin "asm" ve "typeof" anahtar kelimeleri gibi ISO C90 ile uyumlu olmayan, ancak ISO C90'da bir anlamı olmayan diğer GNU uzantılarını atlama gibi belirli özelliklerini kapatır "?:" ifadesinin orta terimi. Öte yandan, bir standardın GNU lehçesi belirtilerek, bu özellikler temel standardın anlamını değiştirse ve bazı katı uyumlu programlar reddedilse bile, derleyici desteğinin tüm özellikleri etkinleştirilir. Belirli standart, standardın bu sürümü verildiğinde hangi özelliklerin GNU uzantıları olduğunu belirlemek için -pedantic tarafından kullanılır. Örneğin -std = gnu89 -pedantic, C ++ stili // yorumları hakkında uyarırken -std = gnu99 -pedantic bunu yapmaz.


Ve bu ikili ?:operatör dışında sizi ne getirir ? Akla gelen tek eklenti olan yapı ifadeleri, C ++ 11 list başlatma ile üstündür. Her durumda, bu alıntı esas olarak C ++ ile değil C ile ilgilidir.
Potatoswatter

9

Derleyicinin belirli bir sürümünde hangi özelliklerin desteklendiği konusunda aşağıdaki bağlantıya başvurabilirsiniz . Derleyicide kapsamlı bir özellik desteği listesi vardır. Görünüşe göre GCC standardı yakından takip eder ve diğer derleyicilerden önce uygular.

Sorunuzla ilgili olarak

  1. g++ -std=c++11 C ++ 11 için
  2. g++ -std=c++14 C ++ 14 için
  3. g++ -std=c++17 C ++ 17 için
  4. g++ -std=c++2aC ++ 20 için tüm C ++ 20 özellikleri henüz desteklenmese de GCC'deki özellik destek listesi için bu bağlantıya bakın .

Belirli bir özelliğin desteklenmesini bekliyorsanız, liste oldukça hızlı değişir, listeye bir göz atın.

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.