我有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/

10-11 07:09