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

Posted

技术标签:

【中文标题】对标志在makefile中的工作方式感到困惑【英文标题】:Confused about how flags work in makefile 【发布时间】:2015-09-11 01:26:59 【问题描述】:

我有 2 个文件: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

【问题讨论】:

您没有在任何规则中使用CXXFLAGS。您可以安全地删除 %.o 并让隐式规则完成它的工作。 有点困惑自己。经过这么多年,我的 Makefu 很弱,但 $(CXX) -o $(BIN) $^ 不应该是 $(CXX) $(CXXFLAGS) -o $(BIN) $^ 以使第一个“工作”示例真正起作用吗? 您的第一个 makefile 使用默认规则将.cpp 转换为.o,默认规则使用$(CXXFLAGS)。您的第二个 makefile 有一个明确的规则来编译 main.cpp,并且它不使用该变量。 感谢@Barmar 随口回答我的问题。 @juanchopanza 我明白了,第一个 makefile 的哪个部分使用了它?我认为必须编写 (FLAGS) 或 (CXXFLAGS) 但第一个可以正常工作。编辑:如何设置不首先输出 .o 文件? rm-f *.o 出于某种原因没有删除它 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于对标志在makefile中的工作方式感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对 struct 在这段代码中的工作方式感到困惑

对 JSONP 请求的工作方式感到困惑

对 robocopy 的工作方式感到困惑

我对 git revert 的工作方式感到困惑

对删除分配给结构数组的动态内存感到困惑

对 Yesod 中的 selectOneMany 感到困惑