对makefile中的flags如何工作感到困惑

时间:2015-09-11 01:27:00

标签: 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) $@ -c $<

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

不起作用:(c ++ 11实际上没有标记,因此无法使用c ++ 11)

CXX=g++
CXXFLAGS=-g -std=c++11

all:
    g++ main.cpp -o main

1 个答案:

答案 0 :(得分:4)

由于您的第一个makefile没有从.o生成.cpp的规则,因此使用了隐式规则。该规则类似于:

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

您可以在GNU Make here中找到所有隐式规则。

您的第二个makefile没有使用此规则,因为all规则直接编译main,而不是依赖main.o。由于您使用的是显式规则,因此您还需要明确使用该变量。

all:
    $(CXX) $(CXXFLAGS) main.cpp -o main