C++ 对标记在makefile中的工作方式感到困惑

C++ 对标记在makefile中的工作方式感到困惑,c++,gcc,makefile,C++,Gcc,Makefile,我有两个文件:main.cpp,其中包括foo.h。我需要一个用-std=c++11标志编译它们的makefile,但我不知道为什么第一个makefile设置了标志,而第二个没有 作品: CXX=g++ CXXFLAGS=-g -std=c++11 -Wall -pedantic BIN=prog SRC=$(wildcard *.cpp) OBJ=$(SRC:%.cpp=%.o) all: $(OBJ) $(CXX) -o $(BIN) $^ %.o: %.c $(CXX

我有两个文件:main.cpp,其中包括foo.h。我需要一个用-std=c++11标志编译它们的makefile,但我不知道为什么第一个makefile设置了标志,而第二个没有

作品:

CXX=g++
CXXFLAGS=-g -std=c++11 -Wall -pedantic
BIN=prog

SRC=$(wildcard *.cpp)
OBJ=$(SRC:%.cpp=%.o)

all: $(OBJ)
    $(CXX) -o $(BIN) $^

%.o: %.c
    $(CXX) $@ -c $<

clean:
    rm -f *.o
    rm $(BIN)

由于您的第一个makefile没有从.cpp生成.o的规则,因此使用了隐式规则。这条规则看起来像:

%.o: %.cpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $@

由于您的第一个makefile没有从.cpp生成.o的规则,因此使用了隐式规则。这条规则看起来像:

%.o: %.cpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $@

您没有在任何规则中使用CXXFLAGS。您可以安全地删除%.o并让隐式规则执行它的操作。我有点困惑。经过这么多年,我的Makefu很弱,但是$CXX-o$BIN$^不应该是$CXX$cxflags-o$BIN$^吗?要使第一个工作示例真正工作,您的第一个Makefu文件使用默认规则将.cpp转换为.o,默认规则使用$cxflags。您的第二个makefile有一个编译main.cpp的显式规则,它不使用变量you@Barmar感谢您随意回答我的问题。@juanchopanza我明白了,第一个makefile的哪个部分使用了它?我认为必须编写FLAGS或cxflags,但第一个没有它也可以正常工作。编辑:如何设置不在第一次输出.o文件?由于某种原因,rm-f*.o不会删除它您在任何规则中都没有使用CXXFLAGS。您可以安全地删除%.o并让隐式规则执行它的操作。我有点困惑。经过这么多年,我的Makefu很弱,但是$CXX-o$BIN$^不应该是$CXX$cxflags-o$BIN$^吗?要使第一个工作示例真正工作,您的第一个Makefu文件使用默认规则将.cpp转换为.o,默认规则使用$cxflags。您的第二个makefile有一个编译main.cpp的显式规则,它不使用变量you@Barmar感谢您随意回答我的问题。@juanchopanza我明白了,第一个makefile的哪个部分使用了它?我认为必须编写FLAGS或cxflags,但第一个没有它也可以正常工作。编辑:如何设置不在第一次输出.o文件?由于某种原因,rm-f*.o不会删除它
all:
    $(CXX) $(CXXFLAGS) main.cpp -o main