如何在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;清洁始终是该文件的最后;