CFLAGS 在 Makefile 中被忽略

Phi*_*lux 3 makefile c++11

我正在使用以下 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 $<
Run Code Online (Sandbox Code Playgroud)

当我运行 make 时,出现以下错误:

/usr/include/c++/4.9.1/bits/c++0x_warning.h:32:2: error: #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  
Run Code Online (Sandbox Code Playgroud)

编辑:更换规则%.o: %.c%.o: %.cpp修复我的问题。

Tob*_*ght 6

你看到的原因

g++    -c -o main.o main.cpp
Run Code Online (Sandbox Code Playgroud)

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

%.o: %.cpp
#  recipe to execute (built-in):
        $(COMPILE.cpp) $(OUTPUT_OPTION) $<
Run Code Online (Sandbox Code Playgroud)

该命令扩展为

$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)

而不是在你的makefile中设置CCand CFLAGS,你应该设置CXXand CXXFLAGS,这意味着 C++ 而不是 C。这允许上面的内置规则为你工作,然后你只需要确保使用正确的链接器,例如和

pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)
Run Code Online (Sandbox Code Playgroud)

您也不需要%.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
Run Code Online (Sandbox Code Playgroud)