make工程管理器及其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文件的写法什么是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就像一个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?或许很多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的用法如下所示: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?或许很多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的基本使用方法如下: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 摘自《解读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)……其中'目标'对象通常是程序生成的一个文件的名称;例如是一个可执行文件或目标文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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文件中寻找以新的依赖文件为目标的相关的文件,并这样层层进行搜索