7

我可以使用带有 -std=c++0x 选项的 gcc 编译单个文件。但是我不能通过makefile来做到这一点。这是我的makefile中的一组标志(在make抱怨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
4

3 回答 3

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 时可以提供自己的标志。

于 2012-05-28T15:37:43.607 回答
3

您可以将其保留在多行中,但您可能想要append,而不是assign

# e.g.
CFLAGS  += -O3
CFLAGS  += -std=c++0x
CFLAGS  += -pg -D_DEBUG -g -c -Wall
于 2012-05-28T15:38:19.790 回答
0

你从哪里弄来的这么多乱七八糟的东西?早在你为 C++11 修改它之前,那个 makefile 就错了。

让我们从第一行开始:

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)而不是四个(两个 unames,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)
于 2012-05-28T17:31:31.603 回答