【问题标题】:makefile doesn't work with -std=c++11 optionmakefile 不适用于 -std=c++11 选项
【发布时间】:2015-02-15 08:24:54
【问题描述】:

我正在尝试使用带有以下 makefile 的 g++ 4.8.2 来使用一些 C++11 功能

CC=g++
DEBUG=-g
CFLAGS=-c -Wall -std=c++11 $(DEBUG)
LFLAGS = -Wall -std=c++11 $(DEBUG)
SOURCES=test.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=test

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LFLAGS) $(OBJECTS) -o $@ -std=c++11
.cpp .o:
    $(CC)  $(CFLAGS) $< -o $@ -std=c++11

clean:
    rm -rf *o $(EXECUTABLE)    

但是当我调用“make”时,这是我得到的错误消息

$ make
g++    -c -o test.o test.cpp
test.cpp: In function ‘int main()’:
test.cpp:18:15: error: range-based ‘for’ loops are not allowed in C++98 mode
  for (int i : {2, 3, 5, 7, 9, 13, 17, 19})
               ^
make: *** [test.o] Error 1

在我看来,-std=c++11 没有被选中,所以我试图在很多不同的地方抛出该选项,但仍然出现同样的错误。

目前的解决方法是直接使用命令行,这对我有用

$ cat test.cpp
#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World"  << endl;

    for (int i : {2, 3, 5, 7, 9, 13, 17, 19})
    {
            cout << i << " ";
    }
    cout << endl;
    return 0;
}

$ g++ -std=c++11 test.cpp -o test -W
$ ./test
Hello World
2 3 5 7 9 13 17 19

我只是想知道为什么 makefile 不做同样的事情,以及如何更新 makefile 以使用 -std=c++11 选项。

【问题讨论】:

  • -std 被设置了两次,分别在 CFLAGS 和规则中。

标签: c++ c++11 gcc makefile


【解决方案1】:

您的 makefile 存在各种问题,但主要问题似乎是您使用 .cpp 文件创建对象的规则是错误的。你需要一些类似的东西

%.o : %.cpp
    $(CC)  $(CFLAGS) $< -o $@

另一方面,利用makeimplicit rules,设置CXXFLAGSCXX等可能更容易。例如,设置

CXX = g++
CXXFLAGS = -Wall -std=c++11 $(DEBUG)
CPPFLAGS += .... # pre-processor flags, for include paths etc.

并删除 %.o 规则,让 make 做它的事情。请注意,CCCFLAGS 通常用于 C 代码。

【讨论】:

    【解决方案2】:

    我认为您的 .cpp .o: 规则中的空格令人困惑。但我会接受@juanchopanza 的建议并切换到更新的模式语法——它更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 2017-05-03
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多