make工程管理器及其Makefile 及其使用

合集下载

makefile的使用

makefile的使用

makefile的使用
Makefile是一种文本文件,由Make程序读取和执行,用于编译和生成可执行文件、库文件等。

Makefile规定了文件依赖关系和编译指令,通过执行Makefile 文件,可以自动化编译程序和生成可执行文件。

Makefile的使用:
1. 编写Makefile文件:Makefile文件是一个文本文件,可以使用任何文本编辑器进行编写。

Makefile文件应该包含编译指令、文件依赖关系和可执行文件的生成指令等。

2. 执行Makefile文件:在命令行输入“make”命令,Make程序将读取并执行Makefile文件。

若Makefile文件中存在错误,Make程序将报告错误并停止执行。

3. 维护Makefile文件:Makefile文件应该随着代码的变化而更新和维护,以确保编译指令正确地反映了代码的依赖关系。

常用命令:
1. make:执行Makefile文件,开始编译程序。

2. make clean:清除所有中间文件和生成的可执行文件。

3. make install:将生成的可执行文件安装到指定目录中。

4. make uninstall:从系统中卸载指定的可执行文件。

5. make help:显示Makefile文件中定义的所有命令和说明。

make命令与makefile文件的写法

make命令与makefile文件的写法

make命令与makefile文件的写法什么是makefile?或许很多Winodw的程序员都不知道这个东西,因为那些Window的IDE都为你做了这个工作,但我觉得要作一个好的和profeional的程序员,makefile还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Uni某下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,ViualC++的nmake,Linu某下GNU的make。

可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。

当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHatLinu某8.0,make的版本是3.80。

必竟,这个make是应用最为广泛的,也是用得最多的。

而且其还是最遵循于IEEE1003.2-1992标准的(POSI某.2)。

在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。

makefile实例讲解

makefile实例讲解

Makefile 学习笔记:为什么要学习makefile :工作经验让我认识到会不会写makefile从一个侧面说明了一个人是否有完成大型工程的能力,makefile 关系到整个工程的编译规则,一个工程的文件不计其数,其按类型,功能,模块分别放在不同的目录下,makefile定义了一些规则来指定,哪些文件需要先编译,哪些文件需要重新编译,甚至进行更复杂的功能操作,因为makefile就像一个shell脚本一样,其中也可以执行操作系统命令。

而make 只是一个命令工具,是一个解释makefile中的指令的命令工具,一般来说IDE即集成开发环境都有这个命令。

Makefile 的环境:我是在linux下进行的实验linux 系列下,我用的是ubuntu ,当然你可以用redhat 红旗后其他,我想都没有什么问题的。

在做实验的时候我会做一些linux写的c/c++例子来演示,以加深理解。

关于程序的编译和链接:一般来说,c或者是c++,首先把源文件(*.c 或*.cpp)编译成为中间代码文件,这个中间代码文件在windows下是*.obj文件在linux 或unix 是*.o文件即object file 目标文件这个动作就叫做编译,即把源文件编译成目标文件的过程就叫做编译(compile)。

这以后,再把大量的*.obj 或*.o 目标文件合成一个可以执行的文件,这个工程就叫做链接link。

编译时,主要是检查程序的语法是否正确,函数,变量是否都有声明。

至于链接呢,主要是链接函数,和全局变量。

一.M akefile 的规则Target:prerequisitesCommand。

Target就是一个目标文件,可以使obj或是可执行文件还可以是一个标签label,关于标签label会在下面的文目标中讲解。

所以我们现在只关注obj 和可执行文件即可,其实大部分还都是obj文件,或许可执行文件就只有一个。

Prerequisites 是先决条件的意识,其实在这里只是依赖的意思,prerequisites在这里是生成target的所需要的文件或目标。

Makefile经典教程(掌握这些足够)

Makefile经典教程(掌握这些足够)

Makefile经典教程(掌握这些⾜够)makefile很重要什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个⼯作,但我觉得要作⼀个好的和professional的程序员,makefile还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为⼀个专业⼈⼠,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不⾃⼰写makefile 了,会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒。

因为,makefile关系到了整个⼯程的编译规则。

⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作,因为makefile就像⼀个Shell脚本⼀样,其中也可以执⾏的命令。

makefile带来的好处就是——“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全⾃动编译,极⼤的提⾼了软件开发的效率。

make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这个命令,⽐如:Delphi的make,Visual C++的nmake,下GNU的make。

可见,makefile都成为了⼀种在⼯程⽅⾯的编译⽅法。

现在讲述如何写makefile的⽂章⽐较少,这是我想写这篇⽂章的原因。

当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“⽂件依赖性”上做⽂章,这⾥,我仅对GNU的make进⾏讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。

必竟,这个make是应⽤最为⼴泛的,也是⽤得最多的。

⽽且其还是最遵循于IEEE 1003.2-1992标准的(POSIX.2)。

在这篇⽂档中,将以C/C++的源码作为我们基础,所以必然涉及⼀些关于C/C++的编译的知识,相关于这⽅⾯的内容,还请各位查看相关的编译器的⽂档。

makefile用途和用法

makefile用途和用法

makefile用途和用法Makefile是一种用于自动化构建和管理软件项目的工具,它由一系列规则和命令组成。

Makefile的主要作用是根据项目中源代码的依赖关系,判断哪些文件需要重新编译,然后执行相应的编译和链接操作,以生成最终的可执行文件或库文件。

Makefile的用法如下所示:1. 定义规则:Makefile中的规则由目标、依赖和命令组成。

目标是待生成的文件或操作的名称,依赖是生成目标所依赖的文件或操作,命令是生成目标的具体操作步骤。

2. 指定规则:使用“target: prerequisites”格式指定规则,其中target是目标文件,prerequisites是该目标所依赖的文件。

3. 编写命令:在每个规则中,使用Tab键缩进的命令行来定义生成目标的操作步骤。

命令行可以是任何Shell命令,包括编译器和链接器的命令。

4. 依赖关系:通过指定目标文件所依赖的源代码文件或其他目标文件,Makefile可以自动判断哪些文件需要重新编译。

5. 变量定义:Makefile中可以定义变量来存储常用的参数和选项,以便在各个规则中复用。

通过编写Makefile,可以实现以下几个方面的功能:1. 自动编译:Makefile可以根据源代码文件和依赖关系,自动判断哪些文件需要重新编译,从而避免重复编译不必要的文件,提高编译效率。

2. 自动链接:Makefile可以自动处理目标文件之间的依赖关系,并根据链接选项生成最终的可执行文件或库文件。

3. 构建工程:通过Makefile,可以定义多个目标文件和相应的规则,从而一次性构建整个项目,减少手动操作的工作量。

4. 管理项目:Makefile可以定义清理规则,用于删除生成的目标文件和临时文件,保持项目目录的清洁。

Makefile是一个强大的工具,可以大大简化软件项目的构建和管理过程,提高开发效率和可维护性。

通过合理使用Makefile,可以更好地组织和管理项目代码,实现自动化构建和持续集成。

makefile经典教程(学会这些你就是高手了)

makefile经典教程(学会这些你就是高手了)

makefile经典教程(学会这些你就是高手了)Makefile经典教程什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。

这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。

可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。

当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。

必竟,这个make是应用最为广泛的,也是用得最多的。

而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。

makefile基本使用方法

makefile基本使用方法

makefile基本使用方法makefile是一种用来管理和自动化构建程序的工具。

它可以根据源代码文件的依赖关系和编译规则来自动构建目标文件和可执行文件。

makefile的基本使用方法如下:1. 创建makefile文件:在项目的根目录下创建一个名为makefile 的文件。

2. 定义变量:在makefile中,可以使用变量来存储一些常用的参数和路径,以便于后续的使用。

例如,可以定义一个名为CC的变量来指定编译器的名称,如:CC=gcc。

3. 编写规则:在makefile中,可以使用规则来指定如何编译源代码文件和生成目标文件。

一个规则由两部分组成:目标和依赖。

目标是要生成的文件,依赖是生成目标文件所需要的源代码文件。

例如,可以编写以下规则:```target: dependency1 dependency2command1command2```其中,target是目标文件,dependency1和dependency2是依赖的源代码文件,command1和command2是生成目标文件所需要执行的命令。

4. 编写默认规则:在makefile中,可以使用一个默认规则来指定如何生成最终的可执行文件。

默认规则的目标通常是可执行文件,依赖是所有的源代码文件。

例如,可以编写以下默认规则:```all: target1 target2```其中,target1和target2是生成的目标文件。

5. 编写clean规则:在makefile中,可以使用clean规则来清理生成的目标文件和可执行文件。

例如,可以编写以下clean规则: ```clean:rm -f target1 target2```其中,target1和target2是要清理的目标文件。

6. 运行make命令:在命令行中,使用make命令来执行makefile 文件。

make命令会自动根据规则和依赖关系来编译源代码文件和生成目标文件。

例如,可以运行以下命令:``````make命令会根据makefile文件中的规则和依赖关系来编译源代码文件并生成目标文件和可执行文件。

Make工程管理器Makefile

Make工程管理器Makefile

Make工程管理器Makefile 摘自《解读linux 0.11》--作者:赵炯Make工程管理器是一个"自动编译管理器",这里的"自动"是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。

用户只需编写一次简单的编译语句就可以了。

它大大提高了实际项目的工作效率,而且几乎所有Linux下的项目编程均会涉及它。

makefile文件是make工具程序的配置文件。

Make工具程序的主要用途是能自动地决定一个含有很多源程序文件的大型程序中哪个文件需要被重新编译。

makefile的使用比较复杂,详细说明请参考GNU make使用手册。

为了使用make 程序,你就需要makefile文件来告诉make要做些什么工作。

通常,makefile文件会告诉make如何编译和连接一个文件。

当明确指出时,makefile还可以告诉make运行各种命令(例如,作为清理操作而删除某些文件)。

make的执行过程分为两个不同的阶段。

在第一个阶段,它读取所有的makefile文件以及包含的makefile文件等,记录所有的变量及其值、隐式的或显式的规则,并构造出所有目标对象及其先决条件的一幅全景图。

在第二阶段期间,make就使用这些内部结构来确定哪个目标对象需要被重建,并且使用相应的规则来操作。

当make重新编译程序时,每个修改过的C代码文件必须被重新编译。

如果一个头文件被修改过了,那么为了确保正确,每一个包含该头文件的C代码程序都将被重新编译。

每次编译操作都产生一个与源程序对应的目标文件(object file)。

最终,如果任何源代码文件被编译过了,那么所有的目标文件不管是刚编译完的还是以前就编译好的必须连接在一起以生成新的可执行文件。

简单的makefile文件含有一些规则,这些规则具有如下的形式:目标(target)…:先决条件(prerequisites)…命令(command)……其中'目标'对象通常是程序生成的一个文件的名称;例如是一个可执行文件或目标文件。

makefile 的编写及应用

makefile 的编写及应用

makefile 的编写及应用Makefile是一种用来管理编译程序的工具,它提供了一种自动化编译的方式,可以根据文件的依赖关系来自动编译相关的文件,从而提高编译的效率。

Makefile的编写通常包括以下几个部分:目标、依赖关系、命令和变量。

一般来说,一个Makefile文件中可以包含多个规则,每个规则由一个或多个目标、依赖关系和命令组成。

其中目标是需要生成的文件,依赖关系是生成目标所需要依赖的其他文件,命令则是生成目标所执行的命令。

一个简单的Makefile示例如下:```# 定义变量CC = gccCFLAGS = -Wall -Wextra# 定义目标和依赖关系target: main.o func.o$(CC) $(CFLAGS) -o target main.o func.omain.o: main.c func.h$(CC) $(CFLAGS) -c main.cfunc.o: func.c func.h$(CC) $(CFLAGS) -c func.c# 定义清理操作clean:rm -f target main.o func.o```在上述示例中,我们定义了两个目标:target和clean。

其中,target这个目标所依赖的是main.o和func.o两个文件,生成目标的命令是使用gcc编译这两个文件,最后生成一个名为target的可执行文件。

clean这个目标用来清理生成的文件。

应用Makefile可以帮助我们自动地完成编译、链接和清理等操作,提高了开发的效率。

可以在命令行中执行`make`命令来根据Makefile文件来生成目标程序,执行`make clean`命令可以清理生成的文件。

总结起来,Makefile的编写及应用包括以下几个步骤:1. 定义变量,用来保存编译器和编译选项等信息;2. 定义目标和依赖关系,用来描述生成文件之间的依赖关系;3. 编写命令,用来执行生成目标的操作;4. 可选地定义清理操作,用来清理生成的文件;5. 在命令行中执行make命令来根据Makefile文件来自动编译生成目标程序。

Makefie技术详解

Makefie技术详解

makefile 基本结构
上例注意到,第一个字符为 # 的行为注释行。第一个非注释行指定 test.o 为目标,并且依赖于test.C 和 test.h 文件。随后的行指定了如何从目标所 依赖的文件建立目标。 当 test.C 或 test.h 文件在编译之后又被修改,则 make 工具可自动重新编 译 test.o,如果在前后两次编译之间,test.C 和 test.h 均没有被修改,而 且 test.o 还存在的话,就没有必要重新编译。这种依赖关系在多源文件的 程序编译中尤其重要。通过这种依赖关系的定义,make 工具可避免许多不 必要的编译工作。当然,利用 Shell 脚本也可以达到自动编译的效果,但是 ,Shell 脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件, 而 make 工具则可根据目标上一次编译的时间和目标所依赖的源文件的更 新时间而自动判断应当编译哪个源文件。 一个 makefile 文件中可定义多个目标,利用 make target 命令可指定要编 译的目标,如果不指定目标,则使用第一个目标。通常,makefile 中定义 有 clean 目标,可用来清除编译过程中的中间文件,例如: clean: rm -f *.o 运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产 生的所有中间文件。
Makefile示例
1. 多模块项目编译示例 2. 多模块项目共享库编译与使用示例
多模块项目编译示例
• 在示例中有三个模块,它们分别是f1.c,f2.c和f3.c,它 们之间的关系如下图
多模块项目编译示例
项目编译过程分析
按照gcc的工作过程,对模块的编译和链接过程可分为: (1)生成目标代码 gcc -c f1.c gcc -c f2.c gcc -c f3.c (2) 生成可执行程序 gcc -o f f1.o f2.o f3.o

make使用方法以及makefile的编写

make使用方法以及makefile的编写

make使用方法以及makefile的编写make是一个常用的构建工具,通过解析Makefile文件来完成代码的编译、链接和打包等操作。

下面是make的使用方法以及Makefile的编写方法:使用方法:1. 创建一个名为Makefile的文件,并在该文件中定义编译规则。

2. 在命令行中进入到Makefile所在的目录。

3. 执行make命令即可开始编译。

4. make根据Makefile文件中的规则来判断哪些文件需要重新编译,然后执行相应的编译命令。

Makefile的编写:1. 编写规则格式如下:target: dependencies<tab> command其中,target是规则的目标文件,dependencies是依赖的文件,command 是执行的命令。

2. 使用变量来简化编写过程,例如:CC=gccCFLAGS=-Walltarget: dependencies(CC) (CFLAGS) -o target source.c这里的CC是编译器,CFLAGS是编译选项。

3. 使用通配符(如"%")来表示一组文件或者目录,例如:objects := (patsubst %.c, %.o, (wildcard *.c))target: (objects)(CC) (CFLAGS) -o target (objects)这里使用wildcard获取所有的.c文件,然后使用patsubst将.c替换为.o。

4. 可以定义伪目标(phony target)来执行一些特殊的命令,例如:.PHONY: cleanclean:rm -f target (objects)这里的clean是一个伪目标,rm命令会删除目标文件以及所有的依赖文件。

5. 可以使用条件语句来根据不同的条件执行不同的命令,例如:ifdef DEBUGCFLAGS += -gendiftarget: dependencies(CC) (CFLAGS) -o target source.c这里的ifdef DEBUG表示只有在定义了DEBUG宏的情况下才启用-g(调试)选项。

make工程管理器及其Makefile 及其使用

make工程管理器及其Makefile 及其使用
make工具及其使用
make工程管理器是一种能够自动识别更新了文件代码的工具,同时又不需要重复输入冗长的命令行,当文件较多是比较实用
Autoconf和Automake等是这样的工具可以自动生成Makefile文件
1:Make命令和Makefile
要使用make,必须编写一个叫Makefile的文件,它描述了软件包中各个文件之间的关系,提供了更新每个文件的命令
Makefile中还可以使用环境变量,使用环境变量的方法相对比较简单
Makefile中还有一些规则称为隐晦规则,运行make工具对目标文件寻找传统的更新方法,而避免指定任何命令。可以编写没有命令行的规则或根本不编写规则,这样make工具将根据存在的源文件类型或要生成的文件类型决定使用何种隐含规则
Makefile中常见的隐含规则:
在程序目录中创建一个名为makefile的文本文件,将当前工作目录切换到makefile所在的目录,目前这个makefile支持在当前目录中的调用,不支持当前目录和makefile所在不是同一目录的名字
2:Makefile的规则
最基本的编写规则的方法是从最终的源程序文件开始一个一个地查看源文件,把它们要生成的目标文件作为目标,而C源文件和源文件包含的头文件作为依赖文件生成规则,但是我们必须去分析源码文件的嵌套关系,实际上我们可以让gcc做这个工作,当使用gcc的时候,可以用-MM(输出一个Make兼容的相关列表)参数,它可以为每一个输入的C语言源文件输出一个依赖规则,把gcc生成的目标文件作为Makefile规则的目标文件,而把生成这个目标文件的C语言源文件和所有应该被引用的头文件作为依赖,gcc只输出规则的依赖关系,不含有命令部分,用户需要写入需要的命令或什么都不写,make会使用隐含规则

makefile 的简单使用方法

makefile 的简单使用方法

makefile 的简单使用方法【最新版3篇】《makefile 的简单使用方法》篇1Makefile 是一个工程文件的编译规则,用于描述整个工程的自动编译和链接的规则。

它可以简单的认为是一个批处理文件,可以自动执行编译、链接等命令。

以下是一个简单的Makefile 的使用方法:1. 创建一个Makefile 文件,通常以.make 为扩展名。

2. 在Makefile 中指定需要编译的源文件和目标文件,以及编译命令和链接命令。

3. 在Makefile 中定义变量,用于存储编译和链接过程中的相关信息,例如编译器路径、目标文件路径等。

4. 在Makefile 中使用条件语句,根据不同的条件来指定不同的编译和链接规则。

5. 在Makefile 中使用include 语句,将多个Makefile 文件包含在一起,以便更好地组织和管理编译规则。

6. 在Makefile 中使用注释,用于说明编译规则的详细信息和用途。

7. 执行Makefile 命令,使Makefile 中的编译和链接规则生效,生成所需的目标文件。

以上是Makefile 的一个简单使用方法,具体的使用方法还需要根据具体的需求进行调整和修改。

《makefile 的简单使用方法》篇2Makefile 是一个工程文件的编译规则,用于描述整个工程的自动编译和链接的规则。

它可以简单的认为是一个批处理文件,可以自动化编译和链接过程,避免手动执行编译和链接命令。

以下是Makefile 的简单使用方法:1. 创建Makefile 文件:在工程目录中创建一个名为“Makefile”的文件,该文件包含工程的编译规则。

2. 编写Makefile 文件:在Makefile 文件中,编写工程的编译规则,包括显式规则、隐晦规则、变量定义、文件指示和注释等。

3. 编译工程:在命令行中进入工程目录,执行“make”命令,Makefile 会自动执行编译和链接命令,生成可执行文件。

Makefile工程管理器

Makefile工程管理器

Makefile⼯程管理器Make简介:⼯程管理器,⽤来管理较多的⽂件。

其是⼀个“⾃动编译管理器”,这⾥的“⾃动”是指它能根据⽂件时间戳⾃动发现更新过的⽂件⽽减少编译的⼯作量,同时,它通过读⼊Makefile⽂件的内容来执⾏⼤量的编译⼯作。

其只编译改动的代码⽂件,⽽不⽤完全编译。

Makefile格式:target:dependency_filescommand例如:hello.o:hello.c hello.hgcc -c hello.c -o hello.o创建变量:预定义变量,⾃定义变量,环境变量。

⾃定义变量:$*,不包括扩展名的⽬标⽂件名称。

$+,所有的依赖⽂件,以空格分开,并以出现的先后为序,可能包含重复的依赖⽂件。

$<,第⼀个依赖⽂件的名称。

$@,⽬标⽂件的完整名称。

$^,所有不重复的依赖⽂件,以空格分开。

例:⽤vi在同⼀⽬录下编辑⼆个简单的hello程序,如下:#hello.c#include "hello.h"int main(){printf ("hello everyone!\n");}#hello.h#include⽤vi编辑Makefile,如下:OBJS1:=hello.oOBJS2:=hello.c hello.hCC:=gcchello:$(OBJS1)$(CC)$^ -o $@$(OBJS1):$(OBJS2)$(CC) -c $< -o $@退出保存,在shell中键⼊:Make查看结果。

命令行Makefile和make命令讲解教程

命令行Makefile和make命令讲解教程

命令行Makefile和make命令讲解教程.命令行Makefile和make命令讲解教程我们知道make是Linux下的一款程序自动维护工具,配合makefile的使用,就能够根据程序中模块的修改情况,自动判断应该对那些模块重新编译,从而保证软件是由最新的模块构成。

本文分为上下两部分,我们将紧紧围绕make在软件开发中的应用展开详细的介绍。

一、都是源文件太多惹得祸当我们在开发的程序中涉及众多源文件时,常常会引起一些问题。

首先,如果程序只有两三个源文件,那么修改代码后直接重新编译全部源文件就行了,但是如果程序的源文件较多,这种简单的处理方式就有问题了。

设想一下,如果我们只修改了一个源文件,却要重新编译所有源文件,那么这显然是在浪费时间。

其次,要是只重新编译那些受影响的文件的话,我们又该如何确定这些文件呢?比如我们使用了多个头文件,那么它们会被包含在各个源文件中,修改了某些头文件后,那些源文件受影响,哪些与此无关呢?如果采取拉网式大检查的话,可就费劲了。

由此可以看出,源文件多了可真是件让人头疼的事。

幸运的是,实用程序make可以帮我们解决这两个问题——当程序的源文件改变后,它能保证所有受影响的文件都将重新编译,而不受影响的文件则不予编译,这真是太好了。

二、Make程序的命令行选项和参数我们知道,make程序能够根据程序中各模块的修改情况,自动判断应对哪些模块重新编译,保证软件是由最新的模块构建的。

至于检查哪些模块,以及如何构建软件由makefile文件来决定。

虽然make可以在makefile中进行配置,除此之外我们还可以利用make程序的命令行选项对它进行即时配置。

Make命令参数的典型序列如下所示:make [-f makefile文件名][选项][宏定义][目标]Make命令本身的命令行选项较多,这里只介绍在开发程序时最为常用的三个,它们是:–k:如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有该选项,在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了。

14.make工程管理器

14.make工程管理器

3.5 make 工程管理器到此为止,读者已经了解了如何在Linux 下使用编辑器编写代码,如何使用gcc 把代码编译成可执行文件,还学习了如何使用gdb 来调试程序,那么,所有的工作看似已经完成了,为什么还需要make 这个工程管理器呢?专业始于专注卓识源于远见‐25 ‐所谓工程管理器,顾名思义,是用于管理较多的文件。

读者可以试想一下,由成百上千个文件构成的项目,如果其中只有一个或少数几个文件进行了修改,按照之前所学的gcc 编译工具,就不得不把这所有的文件重新编译一遍,因为编译器并不知道哪些文件是最近更新的,而只知道需要包含这些文件才能把源代码编译成可执行文件,于是,程序员就不得不重新输入数目如此庞大的文件名以完成最后的编译工作。

编译过程分为编译、汇编、链接阶段,其中编译阶段仅检查语法错误以及函数与变量是否被正确地声明了,在链接阶段则主要完成函数链接和全局变量的链接。

因此,那些没有改动的源代码根本不需要重新编译,而只要把它们重新链接进去就可以了。

所以,人们就希望有一个工程管理器能够自动识别更新了的文件代码,而不需要重复输入冗长的命令行,这样,make 工程管理器就应运而生了。

实际上,make 工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入makefile 文件的内容来执行大量的编译工作。

用户只需编写一次简单的编译语句就可以了。

它大大提高了实际项目的工作效率,而且几乎所有Linux 下的项目编程均会涉及它,希望读者能够认真学习本节内容。

3.5.1 makefile 基本结构makefile 是make 读入的惟一配置文件,因此本节的内容实际就是讲述makefile 的编写规则。

在一个makefile中通常包含如下内容:需要由make 工具创建的目标体(target),通常是目标文件或可执行文件;要创建的目标体所依赖的文件(dependency_file);创建每个目标体时需要运行的命令(command),这一行必须以制表符(tab 键)开头。

【Linux笔记】make工程管理工具(一)

【Linux笔记】make工程管理工具(一)

【Linux笔记】make工程管理工具(一)1、如何编译具有多个源码(.c文件)的工程上一篇笔记写了如何使用gcc 的编译命令编译:【Linux笔记】Linux下编译C程序。

当源文件较少时,使用gcc编译命令编译就比较方便,在gcc编译命令中依次列出各个源文件就好,比如:gcc src1.c src2.c src3.c src4.c-o src把src1.c、src2.c、src3.c、src4.c编译生成可执行文件src 。

在Linux环境下,一般不具有集成开发环境(IDE),一般都是使用命令来编译。

当源文件较少时,可以使用上面的方式进行编译。

但是,如果我们的项目代码工程源文件很多,几十个,上百个,甚至上千上万个呢,那么该怎么进行编译呢?这时候,就可以使用工程管理文件——Makefile(makefile)文件对你的工程进行管理,然后使用make 工具解释Makefile(makefile)文件中的指令(编译指令)进行我们的项目编译。

2、怎么使用make工具来编译我们的C工程呢平常,在技术的学习时,我习惯于先把要学的技术、原理用起来,再进一步去了解这个技术、原理,有进一步的学习之后,然后再进一步的去进行应用,即用->学->用。

而不是等学会了各种原理才去应用,即学->用。

所以,我们先看怎么用make工具的问题。

当然,首先得想办法编写Makefile文件。

在这之前,我们可以使用 make -v 命令查看我们当前系统是否具有make工具(本文使用的Linux发行版为红帽6):可见,我们系统的make工具版本是3.81。

我们还是以上一篇笔记的例子,这次我们使用make编译我们的hello文件(输出Hello World是我们千年不变的目标)如下是我们编写的Makefile 文件中的内容:有了Makefile文件,我们就可以编译我们的hello.c文件了,如:要注意的是我们Makefile文件中的命令前面空白是一个【Tab】键的长度,不能使用空格键代替,否则是会出错的,如:再或者,想看到我们平时所说的“编译”各个过程,我们可以把Makefile文件修改成:然后使用make工具进行解释:。

3.make工程管理器(ppt)

3.make工程管理器(ppt)

Make Make工程管理器工程管理器主讲人主讲人::李奎makemake 是我们可以在是我们可以在shell shell shell命令提示符下面输入的命令命令提示符下面输入的命令命令提示符下面输入的命令。

通过make make我们更好的管理工程文件我们更好的管理工程文件我们更好的管理工程文件。

如果一个程序是由多个源文件组成的如果一个程序是由多个源文件组成的,,我们需要对每个源文件进行编译文件进行编译,,最后在把需要的源文件生成的中间代码链接成可以执行的文件接成可以执行的文件。

如何使用如何使用make make要使用要使用make make make,,必须编写一个叫做必须编写一个叫做Makefile Makefile Makefile的文件的文件,这个文件描述了软件包中文件之间的关系这个文件描述了软件包中文件之间的关系,,提供更新每个文件的命令新每个文件的命令。

一般在一个软件包里一般在一个软件包里,,通常是可执行文件靠目标文件来更新执行文件靠目标文件来更新,,目标文件靠编译源文件来更新来更新。

什么是什么是makefile makefile makefile文件文件Makefile Makefile文件文件是一个格式文件是一个格式文件,,由make make工具来解释执行工具来解释执行工具来解释执行。

Makefile 文件遵循一定的格式文件遵循一定的格式。

一般一般,,一个最简单一个最简单Makefile Makefile Makefile文件由以下部分文件由以下部分构成构成::目标目标::依赖文件可执行的命令注意注意::在写上面命令的时候需要注意可执行的命令前面只能使用TAB TAB键键,不能有空格之类的字符Makefile Makefile写好之后写好之后写好之后,,每次改变了某些源文件每次改变了某些源文件,,只要执行只要执行make make 命令命令::# make所有必要的重新编译将执行所有必要的重新编译将执行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Makefile中还可以使用环境变量,使用环境变量的方法相对比较简单
Makefile中还有一些规则称为隐晦规则,运行make工具对目标文件寻找传统的更新方法,而避免指定任何命令。可以编写没有命令行的规则或根本不编写规则,这样make工具将根据存在的源文件类型或要生成的文件类型决定使用何种隐含规则
Makefile中常见的隐含规则:
insert.o search.o files.o utils.o
edit:$(OBJS)
gcc–o edit $(OBJS)
main.o : main.c defs.h
kbd.o:kbd.c defs.h command.h
…….
…….
…….
…….
Clearn:
Rm edit $(OBJS)
注意:上例中省略了命令,因为make隐式规则指出:所有“.o”文件都可自动由“.c”文件使用命令“$(CPPFLAGS) $(CFLAGS)-c file.c–o file.o”生成
其中,通常目标是要产生的文件的名称,目标可以是可执行文件或OBJ文件,也可以是一个执行的动作名称,比如clean。命令所在的行首要有空格,空格数为一个制表位(Tab),Makefile文件也可以在描述语句行前加“#”表示注释,make程序将跳过此行不执行,相关命令如果过长,还可以使用反斜杠“\”作为后接行符来续行。Make程序执行Makefile的相关行的默认情况是将执行状态显示出来,如果在相关行前加“@”,就可以避免显示该行
main.o : main.c defs.h
gcc–c mian.c–o main.o
…….
…….
…….
…….
clearn:
rm edit main.o kbd.o command.o display.o\
insert.o search.o files.o utils.o
如采用递归展开方式来定义如下:
常见的自动变量:
命令格式含义
$*不包含扩展名的目标文件名称
$+所有的依赖文件,以空格分开,并以出现的先后为,可能包含重复的依赖文件
$<第一个依赖文件
$?所有时间戳比标文件晚的依赖文件,并以空格分开
$@目标文件的完整名
$^所有不重复的依赖文件,以空格分开
$%如果目标是归档成员,则该变量表示目标的归档成员名称
Makefile变量:
为了进一步简化编辑和维护makefile,make允许在makefile中创建和使用变量,变量时在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。在具体要求下,这些值可以代替目标体、依赖文件,命令已经makefile其他部分
在makefile中的变量定义有两种:一种是递归展开方式,另一种是简单方式
在程序目录中创建一个名为makefile的文本文件,将当前工作目录切换到makefile所在的目录,目前这个makefile支持在当前目录中的调用,不支持当前目录和makefile所在不是同一目录的名字
2:Makefile的规则
最基本的编写规则的方法是从最终的源程序文件开始一个一个地查看源文件,把它们要生成的目标文件作为目标,而C源文件和源文件包含的头文件作为依赖文件生成规则,但是我们必须去分析源码文件的嵌套关系,实际上我们可以让gcc做这个工作,当使用gcc的时候,可以用-MM(输出一个Make兼容的相关列表)参数,它可以为每一个输入的C语言源文件输出一个依赖规则,把gcc生成的目标文件作为Makefile规则的目标文件,而把生成这个目标文件的C语言源文件和所有应该被引用的头文件作为依赖,gcc只输出规则的依赖关系,不含有命令部分,用户需要写入需要的命令或什么都不写,make会使用隐含规则
…….
…….
Clearn:
Rm edit $(OBJS)
可以看到,如果又有新的“.o”文件需要加入,用户只需简单地修改一下“OBJS”变量即可。
Makefile中的变量分为用户自定义变量、预定义变量、自动变量及环境变量,预定义变量和自动变量为通常在makefile都会出现的变量,其中部分有默认值,当然用户可以对其修改
例如:先看看edit这个规则:
edit : main.o kbd.o command.o display.o\
insert.o search.o files.o utils.o
gcc–o edit main.o kbd.o command.o display.o\
insert.o search.o files.o utils.o
后缀名规则
C编译:.c变为.o $(CC)–c $(CPPFLAGS) $(CFLAGS)
C++编译:.cc或.C变为.o $(CXX)–c $(CPPFLAGS) $(CXXFLAGS)
汇编:.o变为.S $(CPP) $(CPPFLAGS)
链接:.o变为progam $(CC) $(LDFLAGS) .o $(LOADLIBES) $(LDLIBS)
OBJS= main.o kbd.o command.o display.o\
insert.o search.o files.o utils.o
edit:$(OBJS)
gcc–o edit $(OBJS)
main.o : main.c defs.h
gcc–c mian.c–o main.o
…….
…….
make的命令格式:#make [选项] [宏] [目标]
宏是执行make时使用的宏值
其中选项有:
-f指定Makefile文件名
-p打印出Makefile中变量数据库和隐含规则
-i忽略linux命令返回的错误,继续执行下面的命令,如果没有该选项,则遇到linux命令出错就会停止
-s表示执行不显示执行命令
具体如下:
命令格式含义
AR库文件维护程序的名称,默认值为ar
AS汇编程序的名称,默认值为as
CC C编译器的名称,默认为cc
CPPC预编译器的名称,默认值为$(CC)-E
CXXC++编译器的名称,默认值为g++
FCFORTRAN编译器的名称,默认值为f77
RM文件删除程序的名称,默认值为rm -f
ARFLAGS库文件维护程序选项,无默认值
-r忽略内部规则
-n按实际运行时的执行顺序显示命令,包括以“@”开头的命令,但并不真正执行,这个选项常用来检查Makefile文件的正确性
-d Debug模式,输出有关文件和检测时间的详细信息
-t修改每个目标文件的更新日期,但不重写创建这些文件
-c dir在读取Makefile之前改变到指定的目录dir
尽量将自己的源程序中的源程序集中在一个目录中,并且把makefile和源程序放在一起,这样用起来比较方便,如果make程序中没有使用-f选项指定一个Makefile,make将在当前目录下按顺序寻找下列文件:GNUMakefile、Makefile和makefile,推荐使用Makefile,因为它的第一个字母大写,通常被列在一个目录文件列表的最前面。Makefile文件都可以使用vi或emacs这样的文本编辑器来编辑。在makefile文件中除了依赖关系的描述外,还可以有宏,宏代表文件名和命令任选项的短名
make工具及其使用
make工程管理器是一种能够自动识别更新了文件代码的工具,同时又不需要重复输入冗长的命令行,当文件较多是比较实用
Autoconf和Automake等是这样的工具可以自动生成Makefile文件
1:Make命令和Makefile
要使用make,必须编写一个叫Makefile的文件,它描述了软件包中各个文件之间的关系,提供了更新每个文件的命令
make程序也可以指定要指定要进行维护的目标,如:#make test.o就只把test.o当作目标,而只考虑它所依赖的文件的更新
如果想使用自己指定的Makefile文件,可以使用如下命令:#make–f filename这样,make就在当前目录下寻找文件名为filename的Makefile文件并读入相关行
Makefile的最大特点是“自动化编译”,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发效率,如果想要删除执行文件和所有的中间目标文件,那么只需要简单地执行一下“make clean”即可,这里要说明的一点是,clean不是一个文件,它只不过是一个动作名词,也可称为标签,其后的冒号什么都没有。这样make就不会自动去查找文件之间的依赖性,因此也就不会自动执行其后所定义的命令
Make程序利用Makefile的数据和每个文件最近一次更改的时间来确定哪个文件需要更新,对每个更新文件,make程序使用Makefile中定义的命令来更新它,Makefile在文件说明如何编译个源文件并链接生成可执行文件,并要求源文件之间的依赖关系
Makefile文件的格式:
目标:依赖项列表
[命令]
递归展开方式定义的变量在该变量替换时进行替换,如果该变量包含了对其他变量的引用,则在引用该变量时一次性将嵌套的变量全部展开
递归展开方式的定义格式为:VAR=var。
简单展开方式的定义为:VAR:=var
Make中的变量使用均使用格式为$(VAR)
注意:变量名是不包括:‘:’、‘#’、‘=’、结尾空格的任何字符串,变量名大小写敏感,推荐makefile内部使用小写字母作为变量名
-I dir指定使用的Makefile所在的目录
-w在处理Makefile之前和之后,都显示工作目录
如果只输入
#make
即没有指定其他任何参数,make将对Makefile中的第一行目标进行维护,在发现目标依赖于其他文件时,又继续在Makefile文件中寻找以新的依赖文件为目标的相关的文件,并这样层层进行搜索
相关文档
最新文档