如何在Linux操作系统下编写makefile文件
在这里,我想说一些关于规则和方法,程序编译时一般,无论是C,C++,或PAs,首先将源文件编译成中间代码文件,在Windows或.obj文件,Unix,O文件,目标文件,这个动作叫做编译(编译),然后大量的对象文件合成的执行文件,这就是所谓的链接。编译时,编译器需要正确的语法和函数和变量的声明是正确的。对于后者,通常你需要告诉编译器的头文件的位置(头文件中应该只是一个声明和定义应放在C / C++文件)。只要所有的语法正确,编译器可以编译的中间目标文件。一般来说,每个源文件应该对应于一个中间目标文件(一个文件或一个obj文件)。
链接主要是链接函数和全局变量,所以我们可以使用这些中间目标文件(O文件或obj文件)链接我们的应用程序。不管哪里的源文件链接功能,但功能的中间文件(目标文件),大多数时候,由于源文件太多,太多编译器生成的中间文件,当链接需要明确指出中间目标文件名,编译器是不容易的,所以我们要到中间目标文件打个包,在Windows库文件的软件包称为(库文件),这是lib文件中。UNIX,档案,文件,或文件。
综上所述,源文件首先生成中间目标文件,然后执行文件是由中间目标文件生成,编译时,编译器只检测程序的语法,以及是否变量和函数的声明。如果函数没有声明,编译器会发出警告,但对象文件可以生成。在链接,链接器将搜索所有对象文件,功能实现,如果不是,它将报告链接错误代码(链接错误),在VC,这种错误一般是:链接2001错误,意味着连接器未能找到实现你需要的功能。指定目标文件。的功能
嗯,嗯,GNU make有很多内容,所以不用再谈了,我们开始吧。
Makefile介绍
mdash;mdash;mdash;mdash;mdash;mdash;mdash;
当要执行命令,一个makefile文件需要告诉如何使命令需要编译和链接程序。
首先,我们用一个例子来说明写作规则的makefile。为了给你一个意识。这个例子是从手工GNU。在本例中,我们的项目有8个C文件和3个头文件。我们需要写一个makefile告诉make命令如何编译和链接这些文件。我们的规则:
1)如果这个项目没有被编译,我们所有的C文件都将被编译和链接。
2)如果修改了这个项目中的一些C文件,那么我们只编译修改后的C文件并链接目标程序。
3)如果这个项目的头文件被改变了,那么我们需要编译那些引用头文件并链接目标程序的C文件。
只要我们写makefile的足够好,所有的这一切,我们用make命令来完成,make命令会自动修改文件以确定哪些文件需要重新编译的现状,并编译所需的文件和目标程序的链接。
一、makefile规则
之前告诉Makefile,让我们看看makefile规则,粗看。
目标……先决条件…
命令
…
…
目标也是一个目标文件,它可以是一个对象文件或一个执行文件,它也可以是一个标签(标签),它将在后面的伪目标和本章的章节中描述。
先决条件是生成目标所需的文件或目标。
命令是执行所需的命令。
这是一个文件的依赖关系,也就是说,一个或多个目标文件取决于条件的文件,并生成规则中定义的命令。也就是说,如果在条件一个以上的文件比目标文件更新,由命令定义的命令将被处死。这是makefile的规则。这是makefile的最核心的内容。
最后,makefile的事情是这样的,如果我的文档应该结束。哈哈 u3002not呢,这是主线和核心的makefile,但是这不足以写makefile好。我会慢慢来和我的工作经验结合起来。内容更多。
二,一个例子
正如前面提到的,如果一个项目有3的头文件和8个C文件,要完成上述三个规则,我们的Makefile应该如下。
编辑:主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
CC O编辑主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
主啊:主。C H DEF。
cc
大骨节病:大骨节病。O。C DEF。H H命令。
CC C C大骨节病。
命令:命令。O。C DEF。H H命令。
命令行
显示:显示。O。C DEF。H H缓冲。
cc
插入:插入。O。C DEF。H H缓冲。
插入法
搜索:搜索。O。C DEF。H H缓冲。
搜索引擎
文件:文件。O。C DEF。H H H命令缓冲区。
cc文件
工具:工具。O。C H DEF。
CC C C工具。
清洁:
RM编辑主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
反斜杠()是一个换行符的意思。这使得makefile容易阅读。我们可以挽救这个内容在文件makefile,或makefile,然后直接输入命令make目录中,然后就可以生成执行文件编辑。如果你想删除执行文件和所有的中间目标文件,只是简单地执行使clean它是好的。
这个Makefile文件,目标文件(目标)包含了可执行文件编辑和中间目标文件(*. O),和相关文件(前提)是.c文件和.h文件在结肠。每个。O文件有一组依赖文件,而这些文件。O也是一个依赖文件执行文件编辑,依赖关系本质上是一个描述文件的目标文件生成的,换句话说,这些文件被更新。
定义了依赖项之后,下面的行定义了如何生成目标文件的操作系统命令。它必须从tab键开始。记住,不管命令如何工作,他只负责执行定义的命令。如果先决条件文件的日期长于目标文件的日期,或者目标不存在,则生成将执行随后定义的命令。
这里要指出,清洁是不是一个文件,它只是一个动作的名称,有点像标签的C语言,什么都没有,结好后,会自动查找文件的依赖,不会被定义命令自动执行。执行后续命令,该标签的名称指出在作出命令。这种方法是很有用的。我们可以定义不必要的汇编或编译Makefile独立的命令,如节目包装程序备份,等等。
三,如何制作作品
默认的方式是,我们只输入make命令,
1、将查找当前目录的名字叫;Makefile或makefile文件。
2,如果找到,它将在文件(目标)中找到第一个目标文件。在上面的例子中,他会发现edit该文件将作为最终的目标文件。
3,如果编辑文件不存在,或者编辑文件的时间取决于O文件的修改时间超过编辑文件的时间,那么他将执行后面定义的命令来生成编辑文件。
4,如果编辑所依赖的O文件,那么将在当前文件中为O文件找到目标的依赖关系。如果找到,它将生成基于该规则的O文件(这有点像堆栈进程)。
5,当然,您的C文件和h文件存在。因此,生成将生成O文件,然后使用O文件来完成生命的最终任务,即执行编辑。
这是依赖整个制作,并将寻找层文件层的依赖直到第一目标文件编译。在搜索过程中,如果有错误,例如最后的依赖文件没有找到,然后将直接退出并报告错误,但该命令错误的定义,或者编译不成功,使忽视。只有依靠文件,依赖的是,如果我没有在我找到一个依赖结肠后发现了一个文件,那么对不起,我不会工作。
通过以上的分析,我们知道,与清洁一样,它不会直接或间接地与第一个目标文件相关联,那么在它之后定义的命令不会自动执行。然而,我们可以让执行,命令mdash;mdash;使clean为了明确所有的目标文件,重新编译。
所以在我们的规划,如果项目被编译,当我们修改一个源文件,如文件。C,那么根据我们的依赖,我们的目标将被编译的文件。O(这是根据后面的关系定义和命令)文件。文件是最新的文件。啊,所以文件修改时间比编辑,所以编辑将重新连接(见编辑对象文件后定义的命令)。
如果我们改变command.h然后,KDB。O,O,命令和文件。啊,都会被重新编译,并将链接编辑。
四、在makefile中使用变量
在上面的示例中,让我们先看看编辑的规则:
编辑:主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
CC O编辑主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
我们可以看到两个文件重复了一次。如果我们的项目需要添加一个新的{,}文件,然后我们需要添加两处(应该是三的地方,在干净的另一个地方)。当然,我们的makefile并不复杂,所以增加两处不累,但如果makefile变得更加复杂,我们可以忘记一个地方的加入,这将导致编译失败。所以,对makefile的维护方便,我们可以在makefile使用变量。makefile变量是字符串,它可能是更好的理解C语言中的宏。
例如,我们声明一个变量称为对象,对象,对象,对象,对象,或对象,不管怎样,只要它能表达OBJ文件。我们定义在Makefile的开始:
对象=主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
所以我们可以使用这个变量在makefile中方便地的方式,对象(对象),所以我们的改进的makefile成为继。
对象=主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
编辑:$(对象)
cc编辑$(对象)
主啊:主。C H DEF。
cc
大骨节病:大骨节病。O。C DEF。H H命令。
CC C C大骨节病。
命令:命令。O。C DEF。H H命令。
命令行
显示:显示。O。C DEF。H H缓冲。
cc
插入:插入。O。C DEF。H H缓冲。
插入法
搜索:搜索。O。C DEF。H H缓冲。
搜索引擎
文件:文件。O。C DEF。H H H命令缓冲区。
cc文件
工具:工具。O。C H DEF。
CC C C工具。
清洁:
编辑$(对象)
因此,如果添加了一个新的O文件,我们只需简单地修改对象变量即可。
一个变量更多的主题,我会给你一个接一个在以下。
五。让我们自动推断
GNU的力量非常强大。它可以自动推断命令后文件和文件的依赖性。因此,我们不需要在每一个{ }文件之后编写类似的命令,因为我们的命令将自动识别和推断命令。
只要创建一个{ } }文件,它就会自动地添加到依赖关系的。如果发现什么。啊,那么无论。C将是什么。O的依赖文件。和CC C什么的。C将派生的,所以我们的makefile不再那么复杂。我们新的Makefile是出炉了。
对象=主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
编辑:$(对象)
cc编辑$(对象)
主啊:DEF。H
大骨节病。O:DEF。H H命令。
命令。O:DEF。H H命令。
显示。O:DEF。H H缓冲。
插入。O:DEF。H H缓冲。
搜索。O:DEF。H H缓冲。
文件。O:DEF。H H H命令缓冲区。
工具。O H:DEF。
假的:干净的
清洁:
编辑$(对象)
这种方法也是使;神秘的规则;在上述文件,内容。phony表明清洁是一个伪目标文件。
一个更详细的;,晦涩的规则;伪目标文件,我会给你一个接一个在下面。
六。另类的makefile
现在,我们将可以自动获得订单,然后我看到{ }和{桩。O。H }一点不舒服,所以许多重复{,},不能放在一起,好的,没问题,这是很容易的,谁叫它提供命令和文件的功能您需要在makefile的新风格一看自动推导。
对象=主啊,大骨节病。O O O命令显示。
插入。搜索。O文件。O O工具。
编辑:$(对象)
cc编辑$(对象)
$(对象):H DEF。
大骨节病。O命令。O文件。O H:命令。
显示文件。o搜索。O文件。
假的:干净的
清洁:
编辑$(对象)
这种风格让我们的makefile文件很简单,但我们的文件依赖有点乱。你不能两者兼得。看看你喜欢什么。我不喜欢这样的风格。第一,对文件的依赖性不明确。二,如果有多个文件,我们不清楚是否要添加几个新的O文件。
七。清除目标文件的规则
每个Makefile应该习惯写空对象文件(。O和可执行文件),这不仅有利于重新编译,但也有助于保持文件清洁。这是一个对;培养;(哈哈,还记得我的设计文化)的一般风格:
清洁:
编辑$(对象)
更稳健的方法是:
假的:干净的
清洁:
-编辑$(对象)
如前所述,。假意味着清洁是伪目标,rm命令的前面加一个小负的意思,也许一些文件的问题,而不是继续做一些事情。当然,那干净的规则并不是放在文件的开头,否则会成为默认的目标,相信没有人愿意这么做。不成文的规则是mdash;mdash;清洁始终是该文件的最后;