Makefile修改以支持c ++ 11

时间:2012-05-28 15:35:49

标签: c++ makefile c++11

我可以使用带有-std = c ++ 0x选项的gcc编译单个文件。但我不能通过makefile来做到这一点。以下是我的makefile中的标志集(在抱怨c ++ 11关键字之后):

MACHINE = $(shell echo `uname -s`-`uname -m` | sed "s/ //g")
CCC     = CC
CCC     = g++
CFLAGS  = -O3
CFLAGS  = -std=c++0x
CFLAGS  = -pg -D_DEBUG -g -c -Wall
LFLAGS  = -O
LFLAGS  = -pg -g

我错过了什么?

修改: 我将其更改为以下内容,但我仍然遇到编译错误,我无法使用命令行gcc调用。

CXXFLAGS=-O3 -std=c++0x -pg -D_DEBUG -g -c -Wall

3 个答案:

答案 0 :(得分:12)

这样您的makefile将使用您的所有CFLAGS

CFLAGS=-O3 -std=c++0x -pg -D_DEBUG -g -c -Wall

你用每个“CFLAGS = ...”声明覆盖它们。

此外,它应该是CXXFLAGS,而不是CFLAGSCFLAGS适用于C应用程序。

正如@Florian Sowade所说,你可以使用CFLAGS += -O3 -std....(或CXXFLAGS ..),以便用户在执行make时可以提供自己的标志。

答案 1 :(得分:3)

您可以将其保留为多行,但您可能希望追加,而不是分配

# e.g.
CFLAGS  += -O3
CFLAGS  += -std=c++0x
CFLAGS  += -pg -D_DEBUG -g -c -Wall

答案 2 :(得分:0)

你从哪里得到那个烂摊子?在你为C ++ 11修改它之前很久就认错了。

让我们从第一行开始:

MACHINE = $(shell echo `uname -s`-`uname -m` | sed "s/ //g")

尝试运行命令echo `uname -s`-`uname -m`,你会看到无论如何都没有空格,那么sed命令中的重点是什么?

也许你想要这个:

MACHINE = $(shell uname -s -m | sed "s/ /-/g")

只运行两个进程(uname和sed)而不是四个进程(两个uname,echo和sed)

如果您正在使用GNU make,那么它应该是

MACHINE := $(shell uname -s -m | sed "s/ /-/g")

所以它只运行一次。

CCC     = CC

什么是CC

CCC     = g++

哦,没关系,你已经取代了这个价值。 C ++编译器的常规make变量是CXX

CFLAGS  = -O3
CFLAGS  = -std=c++0x
CFLAGS  = -pg -D_DEBUG -g -c -Wall

正如其他人所指出的那样,你设置CFLAGS,然后将其设置为不同的东西,然后设置为不同的东西。只保留最后一个值。

LFLAGS  = -O
LFLAGS  = -pg -g

同样在这里,什么是LFLAGS?你的意思是LDFLAGS

调试makefile的一个好方法是创建一个目标来打印出你正在设置的变量,检查它们是否具有你期望的值:

print-vars:
        echo CFLAGS is $(CFLAGS)
        echo LDFLAGS is $(LDFLAGS)