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

Confused about how flags work in makefile

本文关键字:方式感 工作 makefile      更新时间:2023-10-16

我有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没有从.cpp生成.o的规则,因此使用了隐式规则。该规则看起来像:

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

你可以在这里找到GNU Make中的所有隐式规则。

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

all:
    $(CXX) $(CXXFLAGS) main.cpp -o main
相关文章: