对标志在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中的工作方式感到困惑的主要内容,如果未能解决你的问题,请参考以下文章