如何在gcc中启用C ++ 11?


117

我在Mac OSX Mountain Lion上从http://hpc.sourceforge.net使用gcc 4.8.1 。我正在尝试编译使用中的to_string功能的C ++程序<string>。我需要-std=c++11每次使用该标志:

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

有没有一种方法可以默认包含此标志?


3
使用Makefile并将其放入CXXFLAGS

就我个人而言,我已经使用了自动化服务来使用这样的标志进行编译。Makefile也很好,当然还有XCode(或任何其他IDE)。
戴夫

Dev-C ++和其他IDE具有可在其中进行设置的编译器选项
boctulus,2016年

Answers:


90

H2CO3是正确的,您可以使用将CXXFLAGS设置为-std = c ++ 11的makefile。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,include和build目录。

编辑:我修改了默认的c ++编译器,我的g ++版本不是最新的。使用clang ++,此makefile可以正常工作。


感谢Silouane和@ H2CO3 :)我应该学会工作,生成文件
Guddu

1
@guddu:这是一个看起来很完整的入门教程。然后,您可能需要检查特殊宏
Silouane Gerin

1
值得注意的是,标准的Makefile语法要求使用制表符,否则会产生隐晦的错误。这就是为什么我将gmake与RECIPEPREFIX一起使用的原因,如文档所示。制表符是可憎的。永远不要使用它们。
Parthian Shot 2015年

24

如前所述-在项目Makefile或其他情况下,这是项目配置问题,您可能还需要指定其他标志。

但是,一次性程序通常在哪里编写g++ file.cpp && ./a.out呢?

好了,我会像有一些#pragma在源代码级,或可能把在一个默认的扩展-比如.cxx.C11或什么的,默认情况下触发它。但是到今天为止,还没有这样的功能。

但是,由于您可能是在手动环境(例如shell)中工作,因此您可以在其中.bashrc(或任何其他方式)使用别名:

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

或者,对于较新的G ++(以及当您想体验“真正的C ++ 11”时)

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

g++如果您非常讨厌C ++ 03,那么您甚至可以自己别名:)


7

我认为您可以使用specs文件来做到这一点。

在MinGW下,您可以运行
gcc -dumpspecs> specs

它说的地方

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

您将其更改为

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

然后放入
/ mingw / lib / gcc / mingw32 / <version> / specs中

我敢肯定,如果没有MinGW版本,您也可以这样做。虽然不确定在哪里放置规格文件。

该文件夹可能是/ gcc / lib /或/ gcc /。


1
此时,更容易获得gcc-6的版本,其中默认值为C ++ 14。
Marc Glisse 2015年

在Linux下,您可以通过运行找到位置strace -f gcc your-sources-here 2>&1 | grep specs。在一个(较旧的)Debian系统上,这产生了/usr/lib/gcc/i586-linux-gnu/4.9/specsspecs按照答案中的描述进行创建(需要sudo才能在Linux下将其移动到那里),并且像一个魅力一样起作用!谢谢。
阿德里安W

0

如果您正在使用sublime,那么如果将其作为构建系统的代码添加到build中,则此代码可能会起作用。您可以使用此链接获取更多信息。

{
    "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}\""
        }
    ]
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.