`

Makefile(转)

 
阅读更多

Makefile 文件如下:
func: main.o func1.o func2.o
        gcc main.o func1.o func2.o -o func
main.o: main.c mylib.h
        gcc -Wall -c main.c
func1.o: func1.c mylib.h
        gcc -Wall -c func1.c
func2.o: func2.c mylib.h
        gcc -Wall -c func2.c
然后在这个目录下运行make编译:
$ make
gcc -Wall -c main.c
gcc -Wall -c func1.c
gcc -Wall -c func2.c
gcc main.o func1.o func2.o -o func
make命令会自动读取当前目录下的Makefile 文件,完成相应的编译步骤。
Makefile 由一组规则组成,每条规则的格式是:
target ... : prerequisites ...
command1
command2
...
例如:
func: main.o func1.o func2.o
        gcc main.o func1.o func2.o -o func
func是这条规则的目标(Target), main.o func1.o和 func2.o是这条规则的条件(Prerequisite)。
目标和条件之间的关系是:欲更新目标,必须首先更新它的所有条件;所有条件中只要有一个条件被更新

了,目标也必须随之被更新。
所谓“更新”就是执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头,注意不能是

空格Makefile 的格式不像C语言的缩进那么随意,对于Makefile 中的每个以Tab开头的命令,make会创建

一个Shell进程去执行它。

对于上面这个例子,make执行如下步骤:
尝试更新Makefile 中第一条规则的目标func,第一条规则的目标称为缺省目标,只要缺省目标更新了就算

完成任务了,其它工作都是为这个目的而做的。由于我们是第一次编译,func文件还没生成,显然需要更

新,但规则说必须先更新了main.o、func1.o和func2.o这三个条件,然后才能更新func。
所以make会进一步查找以这三个条件为目标的规则,这些目标文件也没有生成,也需要更新,所以执行相

应的命令(gcc –Wall -c main.c、gcc –Wall -c func1.c和gcc –Wall -c func2.c)更新它们。
最后执行gcc main.o func1.o func2.o -o func更新func。

如果没有做任何改动,再次运行make:
$ make
make: `main' is up to date .
make会提示缺省目标已经是最新的了,不需要执行任何命令更新它。
现在总结一下Makefile 的规则。如果一条规则的目标属于以下情况之一,就称为需要更新:
目标没有生成。
某个条件需要更新。
某个条件的修改时间比目标晚。

通常Makefile 都会有一个clean规则,用于清除编译过程中产生的二进制文件(.o的目标文件),保留源文

件:
clean:
@echo "cleanning project"
-rm func*.o
@echo "clean completed"
把这条规则添加到我们的Makefile 文件的末尾,然后执行这条规则:
$ make clean
     cleanning project
     rm func *.o
     clean completed

clean目标不依赖于任何条件,并且执行它的命令列表不会生成clean这个文件。
@和-字符的效果:如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果;通常make

执行的命令如果出错,就立刻终止,不再执行后续命令。但如果命令前面加了-号,即使这条命令出错,

make也会继续执行后续命令。通常rm命令前面要加-号,因为rm要删除的文件可能不存在,这个命令有可

能出错,但这种错误是应该忽略的。例如上面已经执行过一遍make clean,再执行一遍就没有文件可删了

,这时rm会报错,但make忽略这一错误,继续执行后面的echo命令。

如果当前目录下存在一个文件叫clean会怎么样呢?
如果存在clean这个文件,clean目标又不依赖于任何条件,make就认为它不需要更新了。而我们希望把

clean当作一个特殊的名字使用,不管它存在不存在都要更新,可以添一条特殊规则,把clean声明为一个

伪目标:
.PHONY: clean
这条规则没有命令列表。
clean:
@echo "cleanning project"
-rm func*.o
@echo "clean completed"
    .PHONY: clean

本例子中的Makefile 文件如下:
func: main.o func1.o func2.o
        gcc main.o func1.o func2.o -o func
main.o: main.c mylib.h
        gcc -Wall -c main.c
func1.o: func1.c mylib.h
        gcc -Wall -c func1.c
func2.o: func2.c mylib.h
        gcc -Wall -c func2.c
clean:
        @echo "cleanning project"
        -rm func *.o
        @echo "clean completed"
.PHONY: clean

clean目标是一个约定俗成的名字,在所有软件项目的Makefile 中都表示清除编译生成的文件,类似这样

的约定俗成的目标名字有:
all,执行主要的编译工作,通常用作缺省目标。
install,执行编译后的安装工作,把可执行文件、配置文件、文档等分别拷到不同的安装目录。
clean,删除编译生成的二进制文件。
只要符合所描述的语法的文件我们都叫它Makefile ,而它的文件名则不一定是Makefile 。事实上,执行

make命令时,是按照GNUmakefile、makefileMakefile 的顺序找到第一个存在的文件并执行它,不过还

是建议使用Makefile 做文件名。

分享到:
评论

相关推荐

    从devkitPro到WinARM的Makefile转换

    标题“从devkitPro到WinARM的Makefile转换”涉及的是在嵌入式开发中,如何将使用devkitPro环境的Makefile转换为适应WinARM工具链的版本。这是一个常见问题,因为不同的开发环境可能有不同的编译器和链接器设置,使得...

    codeblocks工程转makefile

    标题"codeblocks工程转makefile"所指的就是这个转换过程,即把CodeBlocks的`.cbp`工程文件或者`.ws`工作区文件转换为`.makefile`。转换后的`makefile`能够被`make`命令解析并执行编译任务,这对于理解项目结构、自动...

    Makefile中文HTML帮助文档

    【Makefile】是Unix/Linux系统中用于自动化编译、链接和其他构建过程的脚本文件。它定义了一系列规则,告诉操作系统如何构建、测试和安装软件。Makefile中的指令可以帮助程序员节省大量时间,尤其在大型项目中,它...

    转换ADS1.2项目为makefile

    而Makefile则是构建程序的一种规范文件,它定义了编译、链接等步骤以及相关依赖关系,方便开发者通过简单的命令行指令完成整个工程的构建。在ADS1.2项目中,通常使用内置的IDE进行编译和调试,但有时为了在命令行...

    cbp转makefile

    这个主题“cbp转makefile”探讨的是将 Code::Blocks 的 `.cbp` 项目文件转换为通用的 `Makefile`,以便在不同的操作系统,如 Windows 和 Linux 上进行编译。 `.cbp` 文件通常包含了关于项目的所有信息,包括源文件...

    Makefile手册_中文版.pdf

    Makefile是Linux系统下的一种构建工具,它定义了程序编译和链接的所有规则,使得开发人员能够通过一个简单的命令make来自动构建可执行程序。Makefile手册为读者提供了全面的Makefile使用指南,介绍其语法、编写规则...

    跟我一起写Makefile.pdf

    《跟我一起写Makefile》是陈皓大佬撰写的一份PDF文档,主要讲解了如何编写和理解Makefile,以便于管理程序的编译和链接过程。Makefile是软件开发中的一个重要工具,它帮助自动化构建过程,使得编译和链接更加高效。 ...

    Makefile

    ### Makefile核心概念与应用详解 #### 一、Makefile概览 Makefile,作为自动化构建脚本的核心,被广泛应用于软件开发中的编译、链接等任务自动化处理。其核心功能在于通过预定义的规则自动识别文件依赖关系,并...

    Win平台下Makefile使用说明

    在Windows平台上,Makefile是构建自动化工具的核心,它允许开发者编写指令来编译、链接以及执行程序,大大提高了开发效率。下面将详细讲解Makefile的基本语法、宏、预处理命令和自动推导规则。 首先,Makefile的...

    makefile经典扫盲贴

    Makefile是Linux和Unix系统中用于自动化构建、编译、测试等任务的脚本文件,它的存在极大地提高了开发效率,特别是在大型项目中。本篇文章将深入解析Makefile的基础知识,帮助初学者理解并掌握如何编写Makefile。 ...

    Makefile教程,Makefile快速学习资料

    标题中提到的“Makefile教程”是指关于Makefile的学习资料,而“Makefile快速学习资料”说明本资料是为快速掌握Makefile编写的入门级教程。Makefile是Unix系统中的一个工具程序,主要用于软件开发中的自动化编译。它...

    跟我一起学Makefile(PDF版)

    《跟我一起学Makefile》是由陈皓撰写,祝冬华整理的一本关于Makefile学习的PDF教程。Makefile是软件构建过程中的重要工具,尤其在C、C++等编程语言中,它能自动化编译、链接等步骤,提高开发效率。这本书主要针对想...

    MakeFile 中文手册.pdf

    根据提供的文件信息,本手册详细介绍了Makefile的基础知识和使用方法,尤其适合初学者学习和参考。Makefile是一种生成文件的脚本语言,广泛应用于软件开发中,用于自动化构建和编译程序。以下是从标题、描述、标签和...

    MakeFile参考资料集合

    Makefile是Unix/Linux环境下的一种构建工具,用于自动化编译、链接和其他相关任务,极大地提高了开发者的工作效率。在软件开发过程中,Makefile定义了一系列规则来指定如何将源代码转换为可执行程序或库。Bash是一种...

    跟我一起写Makefile

    ### 跟我一起写Makefile #### 第一部分:概述 **Makefile**是一种用于自动化构建过程的脚本文件,在软件开发过程中极为常见。通过编写Makefile,开发者可以定义一系列规则来描述如何编译和链接源代码文件,从而...

    Makefile 指南

    ### Makefile指南知识点详解 #### 一、Makefile概述与基本概念 **1.1 Makefile的基本作用** Makefile是一种脚本文件,用于自动化构建软件项目。它通过一系列规则来描述如何从源代码构建可执行文件的过程。...

    为Graphviz定制的Makefile

    为了提高效率和便捷性,我们可以使用Makefile来自动化这个过程。"为Graphviz定制的Makefile"就是为了解决这个问题而设计的。 Makefile是Unix/Linux系统中用于自动化构建项目的工具,它可以理解一系列规则,根据依赖...

    通用Makefile,适用于C/C++混合编程

    在IT行业中,构建过程是软件开发的关键环节,而Makefile是这个过程中不可或缺的工具。它是一种文本文件,包含了编译、链接等构建步骤的规则,使得开发者能够自动化地管理源代码到可执行文件的转换过程。针对C和C++...

Global site tag (gtag.js) - Google Analytics