Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 我们真的需要吗;“全部”;生成文件中的目标_Makefile - Fatal编程技术网

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)