我有2个文件:main.cpp,其中包含foo.h。我需要一个用-std = c++ 11标志编译它们的makefile,但是我不知道为什么第一个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)
不起作用:(实际上并未标记c++ 11,因此不能使用c++ 11)
CXX=g++
CXXFLAGS=-g -std=c++11
all:
g++ main.cpp -o main
最佳答案
由于您的第一个makefile没有从.o
生成.cpp
的规则,因此将使用隐式规则。该规则类似于:
%.o: %.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $@
您可以在GNU Make here中找到所有隐式规则。
您的第二个makefile不使用此规则,因为
all
规则直接编译main
,而不是依赖于main.o
。由于使用的是显式规则,因此还需要显式使用变量。all:
$(CXX) $(CXXFLAGS) main.cpp -o main
关于c++ - 对标志在makefile中如何工作感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32514093/