Makefile 我们真的需要吗;“全部”;生成文件中的目标
我已从中找到以下代码: ?Makefile 我们真的需要吗;“全部”;生成文件中的目标,makefile,Makefile,我已从中找到以下代码: ? 如果我不保留该行或该行有其他用途,会出现什么问题?当您运行make而未指定目标时,它将运行文件中的第一个目标。按照惯例,此目标负责创建可部署文件(包或可执行文件),以便在您的平台上安装。名称all只是一个(至少在GNU项目中是这样),可以是您喜欢的任何东西(例如$(名称),编译或可部署)。我不知道为什么$(源代码)变量作为all目标的先决条件出现。那太没用了 在您的情况下,因为您只有一个可执行文件,所以不必将全部。但许多makefiles构建了多个互不依赖的“最终目标
如果我不保留该行或该行有其他用途,会出现什么问题?当您运行
make
而未指定目标时,它将运行文件中的第一个目标。按照惯例,此目标负责创建可部署文件(包或可执行文件),以便在您的平台上安装。名称all
只是一个(至少在GNU项目中是这样),可以是您喜欢的任何东西(例如$(名称)
,编译
或可部署
)。我不知道为什么$(源代码)
变量作为all
目标的先决条件出现。那太没用了
在您的情况下,因为您只有一个可执行文件,所以不必将全部
。但许多makefiles构建了多个互不依赖的“最终目标”。在这种情况下,传统的做法是有一个依赖于所有对象的all
目标,这样您就可以用一个命令构建所有对象
而且由于它是传统的,为了保持一致性,人们将它放入makefiles中,并且只有一个目标。从make行为的角度来看 该行:
all: $(SOURCES) $(EXECUTABLE)
在这种情况下是特殊的,因为它是Makefile中定义的第一个目标。由于没有定义使其成为默认目标的.DEFAULT\u GOAL
,因此如果在命令行上没有指定目标,make将以构建什么为目标
在这种特定情况下,它的所有存在都是为了允许您使用命令makeall
<> P>也确保<代码>使所有和<代码>使不能如预期的那样工作,如果有一个名为“所有当前”的文件,则在评估规则时会考虑。
通常的做法是定义这样的目标,这样它们就不会受到带有其名称的文件的影响
例如:.PHONY:all
在本例中,其不起任何其他作用的原因如下:
是一个冗余依赖项,因为$(源)
已经通过$(可执行)
依赖于它,而$(对象)
通过$(源)
.cpp.o:
- 另一个依赖项
是定义的下一个目标,因此删除所有目标将使$(可执行)
成为默认目标$(可执行)
从惯例的角度看
all
目标是一个,并且“应该是默认目标”
一些用户和工具可能认为目标all存在。
例如,IDEEclipse在默认情况下希望Makefiles具有用于增量构建的目标
all
。如果没有所有目标,eclipse需要额外的配置才能构建项目。拥有它有点传统。尤其是在大型项目中,您可能有许多可以单独编译的子组件<代码>在处理小组件时制作一些小的,然后当您准备测试整个软件包时,v.s.不得不做制作sub1 sub2 sub3。。。。sub999
。假设我定义SOURCES2=hello.cpp
,然后定义all:$(SOURCES2)$(可执行)
Makefile是否只编译hello.cpp?否,正如我在回答中解释的$(可执行)
通过后缀规则.cpp.o:
依赖于$(源)
。如果只想编译hello.cpp,可以运行makehello.o
。
all: $(SOURCES) $(EXECUTABLE)
all: $(SOURCES) $(EXECUTABLE)