ฉันจะเปิดใช้งาน C ++ 11 ใน gcc ได้อย่างไร


119

ฉันใช้ gcc 4.8.1 จากhttp://hpc.sourceforge.netบน Mac OSX Mountain Lion ฉันพยายามรวบรวมโปรแกรม C ++ ซึ่งใช้to_stringฟังก์ชันใน<string>. ฉันต้องใช้ธง-std=c++11ทุกครั้ง:

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

มีวิธีรวมแฟล็กนี้โดยค่าเริ่มต้นหรือไม่?


3
ใช้ Makefile CXXFLAGSและวางไว้ใน

โดยส่วนตัวแล้วฉันได้ใช้บริการ Automator เพื่อรวบรวมโดยใช้แฟล็กเช่นนี้ Makefiles ก็ดีเช่นกันและแน่นอนว่ามี XCode (หรือ IDE อื่น ๆ )
Dave

Dev-C ++ และ IDE อื่น ๆ มีตัวเลือกคอมไพเลอร์ที่คุณสามารถตั้งค่าได้
boctulus

คำตอบ:


91

H2CO3 ถูกต้องคุณสามารถใช้ makefile กับชุด CXXFLAGS ด้วย -std = c ++ 11 makefile เป็นไฟล์ข้อความง่ายๆพร้อมคำแนะนำเกี่ยวกับวิธีการคอมไพล์โปรแกรมของคุณ สร้างไฟล์ใหม่ชื่อ Makefile (ด้วยตัวพิมพ์ใหญ่ M) ในการคอมไพล์โค้ดของคุณโดยอัตโนมัติเพียงแค่พิมพ์คำสั่งmakeในเทอร์มินัล คุณอาจต้องติดตั้ง make

นี่เป็นวิธีง่ายๆ:

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)

จะถือว่าไฟล์. cpp ทั้งหมดอยู่ในไดเร็กทอรีเดียวกับ makefile แต่คุณสามารถปรับแต่ง makefile ของคุณเพื่อรองรับ src รวมและสร้างไดเร็กทอรีได้อย่างง่ายดาย

แก้ไข : ฉันแก้ไขคอมไพลเลอร์ c ++ เริ่มต้นเวอร์ชัน g ++ ของฉันไม่เป็นปัจจุบัน ด้วยเสียงดัง ++ makefile นี้ใช้งานได้ดี


ขอบคุณ Silouane และ @ H2CO3 :) ฉันควรเรียนรู้ที่จะทำงานกับ makefiles
Guddu

1
@guddu: นี่คือบทช่วยสอนที่ดูเหมือนเป็นการแนะนำที่ค่อนข้างสมบูรณ์ จากนั้นคุณอาจต้องการตรวจสอบมาโครพิเศษ
Silouane Gerin

1
ควรสังเกตว่าไวยากรณ์ของ Makefile มาตรฐานต้องใช้อักขระแท็บมิฉะนั้นจะให้ข้อผิดพลาดที่คลุมเครือและงี่เง่า ซึ่งเป็นเหตุผลที่ผมใช้กับ gmake RECIPEPREFIX ตามที่ปรากฏในเอกสาร อักขระแท็บเป็นสิ่งที่น่ารังเกียจ ไม่เคยใช้เลย
Parthian Shot

24

ตามที่กล่าวไว้ก่อนหน้านี้ - ในกรณีของโครงการMakefileหรืออื่น ๆ นี่เป็นปัญหาการกำหนดค่าโครงการซึ่งคุณอาจต้องระบุแฟล็กอื่นด้วย

แต่โปรแกรมแบบครั้งเดียวที่ปกติคุณจะเขียนได้g++ file.cpp && ./a.outอย่างไร?

ฉันอยากให้บางคน#pragmaเปิดใช้งานที่ระดับแหล่งที่มาหรืออาจจะเป็นส่วนขยายเริ่มต้น - พูด.cxxหรือ.C11หรืออะไรก็ได้เรียกใช้ตามค่าเริ่มต้น แต่ ณ วันนี้ยังไม่มีฟีเจอร์ดังกล่าว

แต่เนื่องจากคุณอาจทำงานในสภาพแวดล้อมแบบแมนนวล (เช่นเชลล์) คุณสามารถมีนามแฝงในตัวคุณ.bashrc(หรืออะไรก็ได้):

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

หรือสำหรับ G ++ รุ่นใหม่ (และเมื่อคุณต้องการสัมผัส "C ++ 11 จริง")

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

คุณสามารถตั้งชื่อแทนg++ตัวเองได้ถ้าคุณเกลียด C ++ 03 มากขนาดนั้น;)


7

ฉันคิดว่าคุณสามารถทำได้โดยใช้ไฟล์ข้อมูลจำเพาะ

ภายใต้ MinGW คุณสามารถเรียกใช้
gcc -dumpspecs> รายละเอียด

ที่มันบอก

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

คุณเปลี่ยนเป็น

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

แล้ววางไว้ใน
/ mingw / lib / gcc / mingw32 / <version> / spec

ฉันแน่ใจว่าคุณสามารถทำได้โดยไม่ต้องสร้าง MinGW ไม่แน่ใจว่าจะวางไฟล์ข้อมูลจำเพาะไว้ที่ใด

โฟลเดอร์นี้อาจเป็น / gcc / lib / หรือ / gcc /


1
ในเวลานี้การสร้าง gcc-6 นั้นง่ายกว่าโดยที่ค่าเริ่มต้นคือ C ++ 14
Marc Glisse

ภายใต้ Linux strace -f gcc your-sources-here 2>&1 | grep specsคุณสามารถหาสถานที่โดยการทำงาน ที่หนึ่ง (เก่า) ระบบ Debian /usr/lib/gcc/i586-linux-gnu/4.9/specsอัตราผลตอบแทนนี้ สร้างspecsตามที่อธิบายไว้ในคำตอบ (ต้องการ sudo เพื่อย้ายไปที่นั่นภายใต้ Linux) และทำงานได้อย่างมีเสน่ห์! ขอบคุณ
Adrian W

0

หากคุณใช้ซับไลม์รหัสนี้อาจใช้งานได้หากคุณเพิ่มในบิลด์เป็นโค้ดสำหรับสร้างระบบ คุณสามารถใช้ลิงค์นี้เพื่อดูข้อมูลเพิ่มเติม

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