gpt4 book ai didi

c++ - G++ 中的 MakeFile。可忽略的命令

转载 作者:行者123 更新时间:2023-11-28 00:23:09 26 4
gpt4 key购买 nike

我正在学习如何用 g++ 制作 Makefile。我正在使用以下 example该项目的代码是here .这是生成文件

# Makefile for Writing Make Files Example

# *****************************************************
# Variables to control Makefile operation

CXX = g++
CXXFLAGS = -Wall -g

# ****************************************************
# Targets needed to bring the executable up to date

main: main.o Point.o Rectangle.o # ***Statement : 1
$(CXX) $(CXXFLAGS) -o main main.o Point.o Rectangle.o #Commands underneath dependencies have tabs before them

# The main.o target can be written more simply

main.o: Point.h Rectangle.h # ***Statement : 2
$(CXX) $(CXXFLAGS) -c main.cpp

Point.o: Point.h # ***Statement : 3


Rectangle.o: Rectangle.h Point.h # ***Statement : 4

现在我对此有一些疑问,为了便于提问,我还使用语句关键字引用了特定行。

1- 我对陈述 1 的理解是否正确。当 g++ 在 main: 之后遇到 main.o(它是目标 main.o 的依赖项)时,它会跳转到目标 main.0(陈述 2)。然后它检查 main.o 的依赖关系,如果依赖关系(找到两个头文件),它然后运行命令。然后它回来完成下一个依赖关系的任务,依此类推 ??

2-对于Point.o即Point.h的依赖,为什么没有这样的命令

$(CXX) $(CXXFLAGS) -c Point.cpp

和 Rectangle.o 类似,为什么它的依赖项没有命令

$(CXX) $(CXXFLAGS) -c 矩形.cpp

如果有人能澄清这一点,我将不胜感激。

最佳答案

  1. 正确。值得注意的是 gnu make使用修改时间来确定是否满足依赖关系。

  2. makeimplicit rules建筑用.o目标。这些使用变量,例如 $CXX$CXXFLAGS .对于给定的目标,说 foo.o , make将根据源文件的存在应用规则 foo.<ext> , 创建一个目标依赖对 foo.o : foo.<ext> .如果扩展名是 C++ 扩展名(例如 .cpp.cc.C),那么它会按照以下行应用规则:

    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

您已经为 Point.o 指定了额外的依赖 .这被添加到隐式依赖项 Point.cpp .如果修改时间为Point.hPoint.cppPoint.o的更新, 规则将被运行。

正如@Basile 在评论中指出的那样,您可以调用 make-p--print-data-base获取有关 make 的“状态”信息的选项,包括隐式规则。例如,将它与 grep 一起使用,我可以查询构建 .o 的隐式规则来自 C++ 文件的文件:

make -p | grep -A 1 -B 1 COMPILE.cc

输出:

# default
COMPILE.cpp = $(COMPILE.cc)
# makefile (from `Makefile', line 1)
--
--
# default
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
# environment
--
--
# default
COMPILE.C = $(COMPILE.cc)
# environment
--
--
# commands to execute (built-in):
$(COMPILE.cc) $(OUTPUT_OPTION) $<

--
--
# commands to execute (built-in):
$(COMPILE.cc) $(OUTPUT_OPTION) $<

关于您扩展的规则,Point.o : Point.h ,这就是我的 make 版本会产生的结果:

make -p | grep -A 1 -B 1 Point
....
Point.o: Point.cpp Point.h
# Implicit rule search has been done.
....

关于c++ - G++ 中的 MakeFile。可忽略的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26459487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com