รวบรวม C ++ 11 ด้วย g ++


367

ฉันพยายามอัปเดตคอมไพเลอร์ C ++ เป็น C ++ 11 ฉันค้นหาเล็กน้อยและได้ข้อสรุปว่าฉันต้องใช้ธง-std=c++0xหรือ-std=gnu++0xแต่ฉันไม่รู้อะไรเกี่ยวกับธงหลายอย่าง มีใครช่วยฉันบ้าง (ฉันใช้ Ubuntu 12.04)

นี่คือข้อผิดพลาดที่ฉันได้รับจากคอมไพเลอร์เมื่อฉันพยายามใช้ไลบรารี่ซึ่งรวมอยู่ใน C ++ 11 (เช่นอาร์เรย์):

#include <array>
#include <iostream>

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

ไฟล์นี้ต้องการคอมไพเลอร์และการสนับสนุนไลบรารีสำหรับมาตรฐาน ISO C ++ ที่จะมาถึง C ++ 0x ขณะนี้การสนับสนุนนี้อยู่ระหว่างการทดลองและต้องเปิดใช้งานด้วยตัวเลือกคอมไพเลอร์ -std = c ++ 0x หรือ -std = gnu ++ 0x


5
ในรุ่นใหม่ล่าสุดคุณอาจต้องใช้-std=c++11แทน ทั้งคู่อาจได้รับอนุญาต

6
นี่คิดถึงบริบทมากมาย แสดงคำสั่งทั้งหมดที่คุณได้ลอง (อาจเป็นตัวอย่างรหัสที่คุณพยายามรวบรวม) และสิ่งที่ล้มเหลวจริง ๆ
KillianDS

4
@classdaknok_t: ทั้งสองควรจะได้รับอนุญาต, อูบุนตูยังเรือ 12.04 g++-4.6โดยค่าเริ่มต้น (ซึ่งสนับสนุนเท่านั้น-std=c++0x)
KillianDS

3
เพิ่มธงขวาหลังจากเช่นg++ g++ -std=c++0x _filename_ && ./a.out
n คำสรรพนาม 'm

1
มาข้ามโพสต์นี้เพื่อค้นหาข้อความแสดงข้อผิดพลาด ฉันกำลังทำงานในโครงการ QMAKE วิธีแก้ปัญหาสำหรับฉันคือการเพิ่ม CONFIG + = c ++ 11 ลงในไฟล์. pro

คำตอบ:


529

ค่าสถานะ (หรือตัวเลือกคอมไพเลอร์) ไม่มีอะไรนอกจากอาร์กิวเมนต์บรรทัดคำสั่งธรรมดาที่ส่งผ่านไปยังคอมไพเลอร์ปฏิบัติการ

สมมติว่าคุณกำลังเรียกใช้ g ++ จากบรรทัดคำสั่ง (เทอร์มินัล):

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

หรือ

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

ถ้าข้างต้นไม่ทำงาน


8
อย่าลืมที่จะใส่-Wall -gหลังg++
Basile Starynkevitch

7
@BasileStarynkevitch: ฉันจะเพิ่ม-Werrorด้วยไม่มีเหตุผลที่จะไม่ทำเมื่อเริ่มต้นโครงการ
Matthieu M.

3
การสนับสนุน C ++ 11 ที่ดีขึ้นนั้นเป็นที่ถกเถียงกันและการวินิจฉัยที่ดีขึ้นไม่ได้ดูดีขึ้นเท่านี้ (หน้า Clang ที่อธิบายพวกเขาใช้ GCC 4.2 ซึ่งเก่าแก่) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely

58
ไม่มีใครรู้ว่าถ้า / เมื่อคอมไพเลอร์ C ++ จะสนับสนุนมาตรฐาน C ++ 11 โดยค่าเริ่มต้นนั่นคือไม่มีธง?
เดนนิส

2
และในกรณีที่คุณไม่ได้รู้ว่าใน Visual C ++ เพียงแค่ใช้ VC11 (Visual Studio 2012) หรือสูงกว่าจะมี C ++ 11 คุณสมบัติ
gerrytan

44

คุณสามารถตรวจสอบg++คำสั่งของคุณ:

which g++
g++ --version

สิ่งนี้จะบอกคุณว่า complier ใดที่ชี้ไปในขณะนี้

หากต้องการเปลี่ยนเป็นg++4.7 (สมมติว่าคุณได้ติดตั้งไว้ในเครื่องของคุณ) ให้เรียกใช้:

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

จากนั้นเลือก2เป็นการเลือก (เครื่องของฉันชี้ไปที่g++4.7 ดังนั้น *)

เมื่อคุณสลับ complier แล้วเรียกใช้อีกครั้งg++ --versionเพื่อตรวจสอบว่าการสลับเกิดขึ้นอย่างถูกต้อง

ตอนนี้รวบรวมโปรแกรมของคุณด้วย

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

อาจเป็นสิ่งที่ควรค่าแก่การกล่าวถึงว่ารุ่นอย่าง g ++ 4.4 อาจเก่าเกินไปที่จะใช้คุณสมบัติบางอย่างดังนั้นจึงจำเป็นต้องมีการอัพเกรด การอัปเกรดจะขึ้นอยู่กับระบบของคุณและฉันจะหลีกเลี่ยงวิธีการรวบรวม g ++ ด้วยตัวคุณเองและแทนที่คอมไพเลอร์ของระบบเพื่อการอ้างอิง
Colin D

13

อูบุนตูของคุณมี g ++ รุ่นล่าสุดอย่างแน่นอน -std=c++0xธงที่จะใช้เป็น


คุณจะบอกได้อย่างไรว่าเขาใช้อูบุนตู? แค่อยากรู้อยากรู้
Shravan40

22
@ Shravan40 OP กล่าวอย่างชัดเจนI'm using Ubuntu 12.04.ในคำถาม
ทิโมธี Gu

10

หากคุณต้องการเก็บส่วนขยายคอมไพเลอร์ GNU ให้ใช้ -std = gnu ++ 0x แทน -std = c ++ 0x นี่คือคำพูดจากหน้าคน:

คอมไพเลอร์สามารถยอมรับมาตรฐานพื้นฐานหลายอย่างเช่น c89 หรือ c ++ 98 และภาษา GNU ของมาตรฐานเหล่านั้นเช่น gnu89 หรือ gnu ++ 98 โดยการระบุมาตรฐานพื้นฐานคอมไพเลอร์จะยอมรับโปรแกรมทั้งหมดตามมาตรฐานนั้นและโปรแกรมที่ใช้ส่วนขยาย GNU ที่ไม่ขัดแย้งกับมัน ตัวอย่างเช่น -std = c89 ปิดคุณลักษณะบางอย่างของ GCC ที่เข้ากันไม่ได้กับ ISO C90 เช่นคำหลัก "asm" และ "typeof" แต่ไม่ใช่ส่วนขยาย GNU อื่น ๆ ที่ไม่มีความหมายใน ISO C90 เช่นการข้าม เทอมกลางของนิพจน์ "?:" ในทางกลับกันโดยการระบุภาษา GNU ของมาตรฐานคุณลักษณะทั้งหมดที่รองรับคอมไพเลอร์ถูกเปิดใช้งานแม้ว่าคุณสมบัติเหล่านั้นจะเปลี่ยนความหมายของมาตรฐานพื้นฐานและบางโปรแกรมอาจถูกปฏิเสธ มาตรฐานเฉพาะถูกใช้โดย -pedantic เพื่อระบุว่าคุณลักษณะใดเป็นส่วนขยายของ GNU ที่กำหนดรุ่นมาตรฐานนั้น ตัวอย่างเช่น std = gnu89 -pedantic จะเตือนเกี่ยวกับสไตล์ C ++ // ความคิดเห็นในขณะที่ -std = gnu99 -pedantic จะไม่


และอะไรทำให้คุณได้รับนอกเหนือจากตัว?:ดำเนินการไบนารี ส่วนขยายอื่น ๆ ที่นึกถึงคือโครงสร้างของนิพจน์จะถูกแทนที่ด้วยการเริ่มต้นรายการ C ++ 11 ในกรณีใด ๆ ข้อความอ้างอิงนี้ส่วนใหญ่เกี่ยวข้องกับ C ไม่ใช่ C ++
Potatoswatter

9

คุณสามารถอ้างถึงลิงค์ต่อไปนี้ซึ่งคุณสมบัตินี้ได้รับการสนับสนุนในคอมไพเลอร์เวอร์ชั่นเฉพาะ มีรายการสนับสนุนคุณสมบัติครบถ้วนในคอมไพเลอร์ ดูว่า GCC ปฏิบัติตามมาตรฐานอย่างใกล้ชิดและนำไปปฏิบัติก่อนคอมไพเลอร์อื่น ๆ

เกี่ยวกับคำถามของคุณคุณสามารถรวบรวมโดยใช้

  1. g++ -std=c++11 สำหรับ C ++ 11
  2. g++ -std=c++14 สำหรับ C ++ 14
  3. g++ -std=c++17 สำหรับ C ++ 17
  4. g++ -std=c++2aสำหรับ C ++ 20 ถึงแม้ว่าคุณสมบัติทั้งหมดของ C ++ 20 ยังไม่ได้รับการสนับสนุนให้อ้างอิงลิงก์นี้สำหรับรายการการสนับสนุนคุณสมบัติใน GCC

รายการเปลี่ยนแปลงค่อนข้างเร็วจับตารายการหากคุณกำลังรอฟังก์ชั่นเฉพาะที่จะรองรับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.