在Makefile中忽略CFLAGS

时间:2014-10-31 16:37:56

标签: c++11 makefile

我使用以下makefile来构建我的项目:

CC      = /usr/bin/g++
CFLAGS  = -Wall -pedantic -std=c++0x
LDFLAGS = 

OBJ = main.o pnmhandler.o pixmap.o color.o 

pnm: $(OBJ)
    $(CC) $(CFLAGS) -o pnm $(OBJ) $(LDFLAGS)

%.o: %.c
    $(CC) $(CFLAGS) -c $<

当我运行make时,我收到以下错误:

  

/ usr / include / c ++ / 4.9.1 / bits / c ++ 0x_warning.h:32:2:错误:#error这   文件需要ISO C ++ 2011的编译器和库支持   标准。此支持目前是实验性的,必须启用   使用-std = c ++ 11或-std = gnu ++ 11编译器选项。

正如我可以从以下内容中读到的那样,CFLAGS没有正确包含在内,但我不知道我做错了什么:

  

g ++ -c -o main.o main.cpp

还尝试了-std=c++11-std=gnu++11,没有任何结果。有什么想法吗?

如果我运行make -Bn,我会:

g++    -c -o main.o main.cpp
g++    -c -o pnmhandler.o pnmhandler.cpp
g++    -c -o pixmap.o pixmap.cpp
g++    -c -o color.o color.cpp
/usr/bin/g++ -Wall -pedantic -std=c++0x -o pnm main.o pnmhandler.o pixmap.o color.o  

编辑:%.o: %.c替换规则%.o: %.cpp可解决我的问题。

1 个答案:

答案 0 :(得分:3)

你看到的原因

g++    -c -o main.o main.cpp

是Make正在调用其标准规则来创建目标文件:

%.o: %.cpp
#  recipe to execute (built-in):
        $(COMPILE.cpp) $(OUTPUT_OPTION) $<

该命令扩展为

$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<

您应该设置CCCFLAGS,而不是在您的makefile中设置CXXCXXFLAGS,而不是使用C语言而不是C语言。在上面的规则为你工作,然后你只需要确保使用正确的链接器,例如与

pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)

您也不需要%.o: %.c规则,因为您没有C来源。

完成Makefile:

CXX      = /usr/bin/g++
CXXFLAGS = -Wall -pedantic -std=c++0x 

OBJ = main.o pnmhandler.o pixmap.o color.o 

pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)

clean::
    $(RM) pnm

.PHONY: clean