我可以使用带有-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
答案 0 :(得分:12)
这样您的makefile将使用您的所有CFLAGS
:
CFLAGS=-O3 -std=c++0x -pg -D_DEBUG -g -c -Wall
你用每个“CFLAGS = ...”声明覆盖它们。
此外,它应该是CXXFLAGS
,而不是CFLAGS
。 CFLAGS
适用于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)