<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Make</id>
	<title>Make - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Make"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Make&amp;action=history"/>
	<updated>2026-07-09T22:23:48Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Make&amp;diff=122064&amp;oldid=prev</id>
		<title>imported&gt;低压电与高电压：​补充括号</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Make&amp;diff=122064&amp;oldid=prev"/>
		<updated>2024-05-21T05:08:24Z</updated>

		<summary type="html">&lt;p&gt;补充括号&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{refimprove|time=2019-04-21T03:15:30+00:00}}&lt;br /&gt;
{{weasel}}&lt;br /&gt;
{{lowercase}}&lt;br /&gt;
{{noteTA|G1=IT}}&lt;br /&gt;
{{Infobox programming language&lt;br /&gt;
 | name                 = &amp;lt;!-- otherwise defaults to {{PAGENAME}} --&amp;gt;&lt;br /&gt;
 | paradigm             = [[巨集]], [[宣告式編程]]&lt;br /&gt;
 | designer             = [[斯圖亞特·費爾德曼]]&lt;br /&gt;
 | released             = {{Start date and age|1976|04}}&lt;br /&gt;
 | programming language = [[C語言|C 語言]]&lt;br /&gt;
 | operating system     = [[類Unix系統|類 Unix 系統]]&lt;br /&gt;
 | file format          = Makefile&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Make&amp;#039;&amp;#039;&amp;#039;是一个在[[软件开发]]中所使用的构建工具，用于[[自動化建構]]軟體。 它通过一个名为 Makefile 的文本文件来描述源代码文件之间的依赖关系和构建规则。 Make 会根据这些规则和依赖关系，判断哪些文件需要重新编译，并执行相应的编译命令，以确保最终生成可执行文件或其他目标文件（这些目标被称为“target”）。 大多数情况下，它被用来[[编译]][[源代码]]，生成[[目标代码|结果代码]]，然后把结果代码连接起来生成[[可执行文件]]或者[[库文件]]。&lt;br /&gt;
&lt;br /&gt;
許多現代軟體的開發環境中（如[[Microsoft Visual Studio]]），[[集成开发环境]]已經取代make，但是在Unix環境中，仍然有許多-{}-工程師採用make來協助軟體開發。&lt;br /&gt;
&lt;br /&gt;
== 起源 ==&lt;br /&gt;
目前虽有众多依赖关系检查工具，但是make是应用最广泛的一个。这要归功于它被包含在[[Unix]]系统中。&amp;lt;ref name=razzveer&amp;gt;{{cite journal |last1=Thompson |first1=T. J. |title=Designer&amp;#039;s Workbench: Providing a Production Environment |journal=Bell System Technical Journal |date=November 1980 |volume=59 |issue=9 |pages=1811–1825 |doi=10.1002/j.1538-7305.1980.tb03063.x|quote=In the general maintenance of DWB, we have used the Source Code Control System and make utility provided by the PWB/UNIX* interactive operating system.}}&amp;lt;/ref&amp;gt;[[斯圖亞特·費爾德曼]]（{{lang|en|Stuart Feldman}}）在1977年在[[贝尔实验室]]（{{lang|en|Bell Labs}}）里制作了这个软件。&amp;lt;ref name=&amp;quot;v7-version&amp;quot;&amp;gt;{{cite web|url=http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7%2Fusr%2Fsrc%2Fcmd%2Fmake%2Fident.c|archiveurl=https://archive.today/20130901165315/http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7%2Fusr%2Fsrc%2Fcmd%2Fmake%2Fident.c|deadurl=yes|title=V7/usr/src/cmd/make/ident.c|author=|date=1 September 2013|archivedate=2013-09-01|website=tuhs.org|accessdate=18 March 2018}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cite journal|last1=Feldman|first1=S. I.|title=Make --- A Program for Maintaining Computer Programs|journal=Software: Practice and Experience|date=April 1979|volume=9|issue=4|pages=255–265|doi=10.1002/spe.4380090402|url=http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.7058|accessdate=11 May 2016|archive-date=2020-09-14|archive-url=https://web.archive.org/web/20200914183707/http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.7058|dead-url=no}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=razzveer/&amp;gt;2003年，斯圖亞特·費爾德曼因发明了这样一个重要的工具而接受了[[美国计算机协会]]（ACM）颁发的软件系统奖。&amp;lt;ref&amp;gt;{{Cite book|pages=[https://archive.org/details/practicaldevelop0000doar/page/94 94]|title=Practical Development Environments|url=https://archive.org/details/practicaldevelop0000doar|author=Matthew Doar|isbn=978-0-596-00796-6|year=2005|publisher=[[O&amp;#039;Reilly Media]]}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在make诞生之前，编译工作主要依赖于操作系统里面的类似于“make”、“install”功能的shell[[腳本語言|脚本]]。它可以批量执行生成目标的命令，并且可以完成依赖关系的检查。这是向现代编译环境发展的重要一步。&lt;br /&gt;
&lt;br /&gt;
== 不同版本 ==&lt;br /&gt;
make程序已被使用者多次重/改寫，其中包括幾次用相同的文件格式和算法原理重新編寫，並且依照不同需要添加了一些不常見的改良。&lt;br /&gt;
&lt;br /&gt;
=== GNU make ===&lt;br /&gt;
[[GNU]] make仿照make的標準功能（透過clean-room工程）重新改寫，並加入作者覺得值得加入的新功能，常和[[GNU]]編譯系統一起被使用，是大多數[[GNU]] Linux安裝的一部分。&lt;br /&gt;
&lt;br /&gt;
=== BSD make ===&lt;br /&gt;
[[BSD]] make是從Adam de Boor的製作的版本上發展成。它編譯目標的時候有並行計算的能力。它在[[FreeBSD]]，[[NetBSD]]和[[OpenBSD]]中不同程度的修改下存活了下來。&lt;br /&gt;
&lt;br /&gt;
=== Microsoft nmake ===&lt;br /&gt;
廣泛應用於[[微軟]]的[[Windows]]，[[微軟]]的nmake是 Visual Studio 随附的命令行工具，不要與來自[[AT&amp;amp;T]]和[[貝爾實驗室]]的Unix系統nmake混淆。&lt;br /&gt;
&lt;br /&gt;
== 优点和缺点 ==&lt;br /&gt;
就像其他和make有着悠久历史的软件一样，make有着很多的拥护者和反对者。它的很多问题因现代大型的软件项目的出现而暴露出来。但是很多人争论说它在常见的情况下可以很好的工作，而且使用非常的简单，功能强大，表达清楚。无论如何，make仍然被用来编译很多完整的[[操作系统]]，而且现在替代品们在基本的操作上与它没有太大差别。&lt;br /&gt;
&lt;br /&gt;
随着现代的[[集成开发环境]]（IDE）的诞生，特别是非Unix的平台上，很多程序员不再手动管理依靠关系检查，甚至不用去管哪些文件是这个项目的一部分，而是把这些任务交给了他们的开发环境去做。类似的，很多现代的编程语言有自己特别的高效的依赖关系的设置方法。&lt;br /&gt;
&lt;br /&gt;
== Makefile ==&lt;br /&gt;
===规则===&lt;br /&gt;
makefile的格式是：&lt;br /&gt;
&lt;br /&gt;
    # 用“#”号表明注释。&lt;br /&gt;
    target（要生成的文件）: dependencies（被依赖的文件）&lt;br /&gt;
    	# 命令前面用的是“tab”而非空格。误用空格是初学者容易犯的错误！&lt;br /&gt;
    {{keypress|TAB}}命令1&lt;br /&gt;
    {{keypress|TAB}}命令2&lt;br /&gt;
    {{keypress|TAB}}命令3&lt;br /&gt;
          .&lt;br /&gt;
    	  .&lt;br /&gt;
    	  .&lt;br /&gt;
    {{keypress|TAB}}命令n&lt;br /&gt;
    # 可以使用“\”表示续行。注意，“\”之后不能有空格！&lt;br /&gt;
    &lt;br /&gt;
*target, dependencies和命令构成了一个makefile里的一个“规则”，规则指示make何时以及如何重新生成target或执行target下的命令&lt;br /&gt;
*target通常是我们要生成的文件的名字，摆放的顺序不重要，但第一个target是默认的target。当make不带参数时，自动执行第一个target。target也可以是要求make完成的动作，执行这种target后并不能得到和target同名的文件，因此，也称为伪target(phony target)。&lt;br /&gt;
*dependencies是生成target所需的文件名列表。依赖可以为空，常用的“clean”target就常常没有依赖，只有命令。若依赖不为空，则make会先检查依赖的“规则”。依赖规定了何时重新执行target下命令。若任何依赖比target更新 （由于执行了依赖的“规则”的命令或用户修改了依赖），make则会重新执行target下的命令。&lt;br /&gt;
*命令可以是任何一个shell能运行的命令。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===示例===&lt;br /&gt;
举例来说明makefile的结构和make如何运作。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
editor: main.o text.o&lt;br /&gt;
	gcc -o editor main.o text.o&lt;br /&gt;
main.o: main.c def.h&lt;br /&gt;
	gcc -c main.c&lt;br /&gt;
text.o: text.c com.h&lt;br /&gt;
	gcc -c text.c&lt;br /&gt;
install:editor&lt;br /&gt;
	mv editor /usr/local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
当我们输入：&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
make&lt;br /&gt;
或者&lt;br /&gt;
make editor&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
当editor这个target文件不存在，或者main.o、text.o这两个依赖文件被修改，都会导致make调用其下的命令“gcc -o editor main.o text.o”；接下来，由于引用到main.o和text.o，make会检查main.o的依赖main.c、def.h有无更新，如果有，则执行其下的命令“gcc -c main.c”；同样的道理，也适用于text.o。&lt;br /&gt;
于是，可有几种不同的输出：&lt;br /&gt;
*第一次运行：&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
gcc -c main.c&lt;br /&gt;
gcc -c text.c&lt;br /&gt;
gcc -o editor main.o text.o&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
*main.c或/和def.h有修改：&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
gcc -c main.c&lt;br /&gt;
gcc -o editor main.o text.o&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
*text.c或/和com.h有修改：&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
gcc -c text.c&lt;br /&gt;
gcc -o editor main.o text.o&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
*main.c和text.c均有修改：&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
gcc -c main.c&lt;br /&gt;
gcc -c text.c&lt;br /&gt;
gcc -o editor main.o text.o&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
当我们输入：&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
make会检查install的依赖editor是否是最新，如果是，则执行其下的命令“mv editor /usr/local”。由于这个过程并没有产生名为“install”的文件，所以，install是一个假目标。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===巨集===&lt;br /&gt;
“[[巨集]]”指的是用一个字符串代替另一个字符串的功能。在makefile中可以使用“=”号来定义巨集，使用“$（巨集名）”来使用巨集；还可以用“+=”追加巨集的内容。习惯上，巨集名使用大写。承接上面的例子：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
OBJECTS = main.o text.o&lt;br /&gt;
INSTALL_PATH = /usr/local&lt;br /&gt;
editor: $(OBJECTS)&lt;br /&gt;
	gcc -o editor $(OBJECTS)&lt;br /&gt;
main.o: main.c&lt;br /&gt;
	gcc -c main.c&lt;br /&gt;
text.o: text.c&lt;br /&gt;
	gcc -c text.c&lt;br /&gt;
install:editor&lt;br /&gt;
	mv editor $(INSTALL_PATH)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
* [[Apache Ant]]&lt;br /&gt;
* [[CMake]]&lt;br /&gt;
&lt;br /&gt;
==参考资料==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
* [https://www.gnu.org/software/make/ GNU Make官方网站] {{Wayback|url=https://www.gnu.org/software/make/ |date=20210204070747 }}&lt;br /&gt;
* [https://web.archive.org/web/20081205025958/http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html GNU make中文手册]&lt;br /&gt;
* [https://seisman.github.io/how-to-write-makefile/index.html 跟我一起写Makefile] {{Wayback|url=https://seisman.github.io/how-to-write-makefile/index.html |date=20180806054647 }}&lt;br /&gt;
&lt;br /&gt;
{{Unix命令}}&lt;br /&gt;
{{DEFAULTSORT:Make}}&lt;br /&gt;
&lt;br /&gt;
[[Category:程序设计工具]]&lt;br /&gt;
[[category:Unix软件]]&lt;br /&gt;
[[Category:自动化构建]]&lt;br /&gt;
[[Category:編譯工具]]&lt;br /&gt;
[[Category:带有代码示例的条目]]&lt;/div&gt;</summary>
		<author><name>imported&gt;低压电与高电压</name></author>
	</entry>
</feed>