Làm cách nào để bật C ++ 11 trong gcc?


117

Tôi sử dụng gcc 4.8.1 từ http://hpc.sourceforge.net trên Mac OSX Mountain Lion. Tôi đang cố gắng biên dịch một chương trình C ++ sử dụng to_stringhàm trong <string>. Tôi cần sử dụng cờ -std=c++11mọi lúc:

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

Có cách nào để bao gồm cờ này theo mặc định không?


3
Sử dụng Makefile và đặt nó vào CXXFLAGS.

Cá nhân tôi đã sử dụng dịch vụ trình tự động để biên dịch bằng các cờ như thế này. Makefiles cũng tốt, và tất nhiên là có XCode (hoặc bất kỳ IDE nào khác).
Dave

Dev-C ++ và IDE khác có các tùy chọn biên dịch, nơi bạn có thể đặt nó
boctulus

Câu trả lời:


90

H2CO3 nói đúng, bạn có thể sử dụng makefile với bộ CXXFLAGS với -std = c ++ 11 Makefile là một tệp văn bản đơn giản có hướng dẫn về cách biên dịch chương trình của bạn. Tạo một tệp mới có tên Makefile (với chữ M viết hoa). Để tự động biên dịch mã của bạn, chỉ cần nhập lệnh make vào một thiết bị đầu cuối. Bạn có thể phải cài đặt make.

Đây là một đơn giản:

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)

Nó giả định rằng tất cả các tệp .cpp đều nằm trong cùng một thư mục với makefile. Nhưng bạn có thể dễ dàng tinh chỉnh makefile của mình để hỗ trợ src, bao gồm và xây dựng các thư mục.

Chỉnh sửa : Tôi đã sửa đổi trình biên dịch c ++ mặc định, phiên bản g ++ của tôi không được cập nhật. Với clang ++, makefile này hoạt động tốt.


cảm ơn Silouane và @ H2CO3 :) tôi nên học cách làm việc với trang điểm
Guddu

1
@guddu: Đây là một hướng dẫn có vẻ như là một phần giới thiệu khá đầy đủ. Sau đó, bạn có thể muốn kiểm tra các macro đặc biệt
Silouane Gerin

1
Cần lưu ý rằng cú pháp Makefile tiêu chuẩn yêu cầu các ký tự tab, nếu không nó sẽ gây ra các lỗi khó hiểu, ngu ngốc. Đó là lý do tại sao tôi sử dụng gmake với RECIPEPREFIX như được hiển thị trong tài liệu . Các ký tự tab là một sự ghê tởm; không bao giờ sử dụng chúng.
Parthian Shot vào

24

Như đã đề cập trước đây - trong trường hợp của một dự án, Makefilehoặc nếu không, đây là vấn đề cấu hình dự án, nơi bạn có thể sẽ cần chỉ định các cờ khác.

Nhưng những gì về chương trình một lần, nơi bạn thường chỉ viết g++ file.cpp && ./a.out?

Vâng, tôi sẽ giống như có một số #pragmabiến trong ngày ở cấp nguồn, hoặc có thể là một phần mở rộng mặc định - chẳng hạn .cxxhay .C11hay bất cứ điều gì, kích hoạt nó bằng cách mặc định. Nhưng cho đến ngày nay, không có tính năng này.

Tuy nhiên, vì có thể bạn đang làm việc trong môi trường thủ công (tức là shell), bạn có thể chỉ cần có một bí danh trong mình .bashrc(hoặc bất cứ điều gì):

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

hoặc, đối với G ++ mới hơn (và khi bạn muốn cảm thấy "C ++ 11 thực sự")

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

Bạn thậm chí có thể đặt bí danh cho g++chính nó, nếu bạn ghét C ++ 03 đến vậy;)


7

Tôi nghĩ bạn có thể làm điều đó bằng cách sử dụng tệp thông số kỹ thuật.

Trong MinGW, bạn có thể chạy
gcc -dumpspecs> specs

Nó nói ở đâu

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

Bạn thay đổi nó thành

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

Và sau đó đặt nó vào
/ mingw / lib / gcc / mingw32 / <version> / specs

Tôi chắc rằng bạn cũng có thể làm như vậy mà không có bản dựng MinGW. Tuy nhiên, không chắc chắn nơi đặt tệp thông số kỹ thuật.

Thư mục có thể là / gcc / lib / hoặc / gcc /.


1
Tại thời điểm này, sẽ dễ dàng hơn để có được bản dựng của gcc-6, trong đó mặc định là C ++ 14.
Marc Glisse

Trong Linux, bạn có thể tìm thấy vị trí bằng cách chạy strace -f gcc your-sources-here 2>&1 | grep specs. Trên một hệ thống Debian (cũ hơn), điều này mang lại kết quả /usr/lib/gcc/i586-linux-gnu/4.9/specs. Đã tạo ra nó specsnhư được mô tả trong câu trả lời (cần sudo để chuyển nó đến đó trong Linux) và hoạt động như một sự quyến rũ! Cảm ơn.
Adrian W

0

Nếu bạn đang sử dụng sublime thì mã này có thể hoạt động nếu bạn thêm nó vào bản dựng làm mã cho hệ thống xây dựng. Bạn có thể sử dụng liên kết này để biết thêm thông tin.

{
    "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}\""
        }
    ]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.