跟我一起写Makefile(可以注释版)

合集下载

makefile 写法

makefile 写法

makefile 写法makefile是一种用于自动化构建的工具,它可以帮助开发者管理项目中的源代码、依赖关系以及构建过程。

本文将详细介绍makefile的基本语法和使用方法,以及如何根据项目需求编写一个高效的makefile。

在这篇文章中,我们将一步一步回答关于makefile写法的问题。

第一步:什么是makefile及其作用?Makefile是一种文本文件,其中包含一系列的规则,告诉make命令如何编译和链接代码。

它能够根据源代码文件的修改日期来判断哪些文件需要重新编译,从而提高代码的构建效率。

通过makefile,我们可以定义编译器的参数、编译顺序和目标文件等信息,使得项目的构建过程更加简化、自动化。

第二步:makefile的基本语法是什么?Makefile由一系列的规则组成,每个规则都包含目标文件、依赖文件和命令。

下面是一个简单的示例:makefiletarget: dependency1 dependency2command1command2其中,`target`是要生成的目标文件,`dependency1`和`dependency2`是`target`所依赖的文件,`command1`和`command2`是执行的命令。

第三步:如何编写一个最基本的makefile?首先,我们需要确定项目的目标文件和依赖关系。

比如,我们的项目中有两个源代码文件`main.c`和`utility.c`,它们都依赖于一个头文件`utility.h`。

我们的目标是生成一个可执行文件`main`。

makefile# 目标文件main: main.o utility.ogcc -o main main.o utility.o# 依赖关系main.o: main.c utility.hgcc -c main.cutility.o: utility.c utility.hgcc -c utility.c第四步:如何使用变量和函数来简化makefile的编写?在makefile中,我们可以使用变量和函数来简化代码的编写。

[转]makefile文件的编写规则及实例

[转]makefile文件的编写规则及实例

[转]makefile⽂件的编写规则及实例1.⼀个简单的makefile例⼦假设⼀个程序有两个⽂件file1.c,file2.c,每个⽂件都包含head.h,⽣成file可执⾏⽂件file:file1.o file2.o 附属⾏(⽂件的依存关系)gcc -o file1.o file2.o 命令⾏file1.o:file1.c head.hgcc -c file1.cfile2.o:file2.c head.hgcc -c file2.c从file最终的⽬标⽂件开始倒推,依次列出⽂件的依存关系,make在执⾏时:(1)判断file可执⾏⽂件是否存在,若不存在,则执⾏命令⾏,向下寻找依存关系(2)若file存在,则检查依靠⽂件,是否存在更新,若存在更新则执⾏命令⾏,若没有更新则给出提⽰:make:'file' is up to date.2.makefile中的宏定义及内部变量宏定义:OBJS = file1.o file2.oCC = gccCFLAGS = -wall -O -g引⽤:file:$(OBJS)$(CC) $(OBJS) -o filefile1.o:file1.c head.h$(CC) $(FLAGS) -c file1.cfile2.o:file2.c head.h$(CC) $(FLAGS) -c file2.c内部变量:$@:当前规则的⽬的⽂件名$<:依靠列表中的第⼀个依靠⽂件$^:整个依靠列表file:$(OBJS)$(CC) $^ -o $@file1.o:file1.c head.h$(CC) $(FLAGS) -c $< -o $@file2.o:file2.c head.h$(CC) $(FLAGS) -c $< -o $@"$(CC) $(FLAGS) -c $< -o $@"是隐含规则,可以不写,默认使⽤此规则3.假象假设⼀个项⽬要⽣成两个可执⾏⽂件file1和file2,这两个⽂件是相与独⽴的,则在makefile开始处:all:file1 file2make总是假设all要⽣成,去检查它的依赖⽂件4.清除由make产⽣的⽂件clean:rm *.orm file执⾏:make clean则会清除由make⽣成的*.o和file⽂件如果有clean⽂件存在,则清除不会执⾏(因clean没有可依赖的⽂件,永远是最新的)使⽤PHONY⽬标,避免同名⽂件相冲突,不会检查clean⽂件存在与否,都要执⾏清除操作.PHONY : cleanclean:rm *.orm file5.makefile函数搜索当前⽬录,⽣成由*.c结尾的⽂件列表,wildcard--函数名SOURCE = $(wildcard *.c)⽤%.o替换$(SOURCE)中的%.c⽂件OBJS = $(patsubst %.c,%.O,$(SOURCE))6.产⽣新规则SOURCE = $(wildcard *.c)depends:$(SOURCE)gcc -M $(SOURCE) > depends(为每⼀个.c⽂件产⽣规则,c⽂件和相关头⽂件为依靠)在makefile⽂件中:include depends7.⼀个有效的makefile⽂件可以完成⼤部分我们所需要的依靠检查,不⽤做太多的修改就可⽤在⼤多数项⽬⾥功能:搜索当前⽬录,寻找源码⽂件,放⼊SOURCE变量⾥,利⽤patsubst产⽣⽬标⽂件(*.o)CC = gccCFLAGS = -Wall -O -gSOURCE = $(wildcard *.c,*.cc)OBJS = $(patsubst %.c,%.o,$(patsubst,%.cc,%.o,$(SOURCE)))file:$(OBJS)$(CC) $^ -o $@⽤默认规则产⽣⽬标⽂件(*.o)1:编译可执⾏程序。

【最新】makefile范例-word范文 (23页)

【最新】makefile范例-word范文 (23页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==makefile范例篇一:实例—使用make及Makefile文件2.3 实例—使用make及Makefile文件一个工程有3个头文件(head1.h、head2.h、exam2.h)和8个C文件(main.c、exam1.c、exam2.c、exam3.c、exam4.c、exam5.c、exam6.c、exam7.c),建立一个Makefile文件(文件名为makefile),内容如下。

注意,上述12个文件位于同一个目录中。

gcc -o example main.o exam1.o exam2.o exam3.o exam4.o exam5.o exam6.o exam7.omain.o : main.c head1.hgcc -c main.cexam1.o : exam1.c head1.h exam2.hgcc -c exam1.cexam2.o : exam2.c head1.h exam2.hgcc -c exam2.cexam3.o : exam3.c head1.h head2.hgcc -c exam3.cexam4.o : exam4.c head1.h head2.hgcc -c exam4.cexam5.o : exam5.c head1.h head2.hgcc -c exam5.cexam6.o : exam6.c head1.h head2.h exam2.hgcc -c exam6.cexam7.o : exam7.c head1.hgcc -c exam7.cclean :rm example main.o exam1.o exam2.o exam3.o exam4.o exam5.o exam6.o exam7.omakefile文件告诉make命令如何编译和链接这几个文件。

一些通用的makefile模板

一些通用的makefile模板

一些通用的makefile模板
以下是一个简单的通用Makefile模板,用于编译C/C++程序: Makefile.
# 定义编译器。

CC = gcc.
CXX = g++。

# 定义编译选项。

CFLAGS = -Wall.
CXXFLAGS = -Wall.
# 定义链接选项。

LDFLAGS =。

# 定义目标文件。

TARGET = program.
# 定义源文件。

SRCS = main.c file1.c file2.c. # 生成目标文件列表。

OBJS = $(SRCS:.c=.o)。

# 默认目标。

all: $(TARGET)。

# 生成可执行文件。

$(TARGET): $(OBJS)。

$(CC) $(LDFLAGS) -o $@ $^。

# 生成目标文件。

%.o: %.c.
$(CC) $(CFLAGS) -c -o $@ $<。

# 清理生成的文件。

clean:
rm -f $(OBJS) $(TARGET)。

这个模板包含了常见的Makefile设置,包括了编译器的定义、编译选项、链接选项、目标文件、源文件、生成目标文件和可执行文件的规则,以及清理生成文件的规则。

你可以根据自己的需求对其进行调整和扩展。

makefile的通用编写 -回复

makefile的通用编写 -回复

makefile的通用编写-回复Makefile是一种用于自动化构建和管理项目的工具,它使用一种被称为Makefile的文件来指定构建和管理项目的规则。

Makefile通常由一系列目标(target)、依赖关系(dependencies)和命令(commands)组成。

在本文中,我们将详细介绍Makefile的通用编写方法,从创建一个简单的Makefile文件开始,到使用变量、条件、循环和函数等高级特性,帮助读者更好地理解和使用Makefile。

让我们一步一步地回答您的问题,教您如何编写一个高效的Makefile。

第一步:创建一个简单的Makefile文件为了开始编写Makefile,我们首先需要在项目的根目录下创建一个名为Makefile的文本文件。

可以使用任何文本编辑器来创建并编辑这个文件。

在开始编写之前,我们需要了解一些基本的语法和规则。

Makefile文件由一系列规则组成,每个规则包含一个或多个目标、依赖关系和命令。

例如,我们可以创建一个简单的规则来构建一个名为hello的可执行文件:hello: main.ogcc -o hello main.omain.o: main.cgcc -c main.c在这个例子中,我们创建了一个名为hello的目标,它依赖于main.o 文件。

我们还创建了一个名为main.o的目标,它依赖于main.c文件。

每个目标都有相应的命令,用于构建目标所需的文件。

第二步:使用变量变量是Makefile中非常常用的机制,它可以帮助我们更好地管理和维护项目。

可以通过在Makefile文件中定义变量,然后在规则和命令中使用这些变量来简化代码。

例如,我们可以使用变量来代替文件名:CC = gccCFLAGS = -chello: main.o(CC) -o hello main.omain.o: main.c(CC) (CFLAGS) main.c在这个例子中,我们定义了两个变量CC和CFLAGS。

手把手教你如何写Makefile

手把手教你如何写Makefile

手把手教你如何写Makefile陈皓 2005.04.01一、Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target ... : prerequisites ...commandtarget也就是一个目标文件,可以是Object File,也可以是执行文件。

还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。

(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在command中。

说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

这就是Makefile的规则。

也就是Makefile中最核心的内容。

说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。

呵呵。

还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。

内容还多着呢。

:)二、一个示例正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o \insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean :rm edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o反斜杠(\)是换行符的意思。

“万能makefile”写法详解,一步一步写一个实用的Makefile

“万能makefile”写法详解,一步一步写一个实用的Makefile

“万能makefile”写法详解,一步一步写一个实用的Makefilehttps:///qq1452008/article/details/50865535? share_token=52d10253-88ef-4463-9727-2ebc94e23726&tt_from=copy_link&utm_source=copy_link&ut m_medium=toutiao_android&utm_campaign=client_share?=本文转载自:作者:胡彦 2013-5-21出处:/huyansoft/article/details/8924624 提示:本文在原博文的基础上做了一点点修改与完善,诸如原博文的后面有显示不全的地方,自己已完善!作者:胡彦 2013-5-21代码和文档下载地址:/share/link?shareid=616139&uk=2535441 82一目的:编写一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译。

并且当某个.c/.cpp、.h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译。

二要达到这个目的,用到的技术有:1-使用wildcard函数来获得当前目录下所有.c/.cpp文件的列表。

2-make的多目标规则。

3-make的模式规则。

4-用gcc -MM命令得到一个.c/.cpp文件include了哪些文件。

(具体使用细节,请点击博文链接)5-用sed命令对gcc -MM命令的结果作修改。

6-用include命令包含依赖描述文件.d。

三准备知识(一)多目标对makefile里下面2行,可看出多目标特征,执行make bigoutput或make littleoutput可看到结果:bigoutput littleoutput: defs.h pub.h@echo $@ $(subst output,OUTPUT,$@) $^注释:$@指该规则目标集合中能引起该规则执行的目标,$^指这个规则里所有依赖的集合。

linux makefile 写法

linux makefile 写法

linux makefile 写法Linux Makefile 写法Makefile 是一种用于组织和管理软件项目的文件格式,它指导着编译器如何构建程序。

在Linux 环境下,Makefile 是一种特别常见的构建工具,它通过定义目标和规则,使得软件开发人员能够轻松地构建、编译和部署项目。

本文将一步一步回答关于Linux Makefile 写法的问题,帮助你深入了解如何编写高效的Makefile。

第一步:创建Makefile 文件首先,你需要在你的Linux 环境中创建一个名为"Makefile" 的文本文件。

你可以使用任何文本编辑器,如Vim、Nano 或者Emacs 来完成这个任务。

确保你的Makefile 文件保存在项目的根目录下,这样Make 命令才能找到它。

第二步:定义变量在Makefile 中,你可以定义各种变量来存储重复使用的值,如编译器名称、编译选项和目标文件名。

定义变量的语法是"变量名=值",例如:CC=gccCFLAGS=-Wall -WerrorTARGET=myprogram在上面的例子中,我们定义了三个变量:`CC`、`CFLAGS` 和`TARGET`。

`CC` 变量的值是`gcc`,指定了使用GCC 编译器。

`CFLAGS` 变量的值是`-Wall -Werror`,这些编译选项用于启用所有警告,并将警告视为错误。

`TARGET` 变量的值是`myprogram`,这是我们期望生成的最终可执行文件的名称。

第三步:指定编译规则在Makefile 中,你需要指定编译规则来告诉编译器如何构建你的程序。

编译规则由目标、依赖和命令组成。

下面是一个简单的例子:(TARGET): main.o utils.o(CC) (CFLAGS) -o (TARGET) main.o utils.o在上面的例子中,我们指定了一个名为`(TARGET)` 的目标,它依赖于`main.o` 和`utils.o` 两个文件。

跟我一起学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)。

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

大型项目makefile写法

大型项目makefile写法

大型项目makefile写法1. 介绍在大型软件项目中,为了方便管理和构建代码,通常会使用makefile 来编写构建规则。

makefile是用于告诉make命令如何编译和信息程序的文件,它包含了一系列的规则和依赖关系,可以帮助开发人员自动化地构建项目。

2. makefile的基本语法在编写makefile时,需要了解其基本语法。

makefile由一系列规则组成,每个规则包括一个目标、一个或多个依赖项和一组命令。

其中,目标是规则的执行目标,依赖项是目标的依赖文件或者其他目标,命令是执行规则时需要执行的命令。

3. makefile的变量和函数makefile中可以定义变量和函数,以方便代码的重用和管理。

变量可以用来存储一些常量或者路径,函数可以用来进行一些复杂的操作。

在大型项目中,合理使用变量和函数可以使makefile更加清晰易读。

4. makefile的高级用法除了基本的规则、变量和函数外,makefile还支持一些高级用法,比如模式匹配、自动变量等。

这些高级用法可以进一步简化构建规则的编写,提高代码的复用性和可维护性。

5. 大型项目makefile的最佳实践在大型项目中,makefile的写法需要遵循一些最佳实践,比如分模块编写、合理使用变量和函数、注意依赖关系的确定等。

这些实践可以帮助开发人员更好地管理和构建项目,减少出错的可能性。

6. 总结通过合理编写makefile,可以使大型项目的管理和构建变得更加高效和可靠。

在编写makefile时,需要注意其基本语法、变量和函数的使用,以及一些高级用法和最佳实践,从而使makefile更加清晰易读、易于维护。

7. makefile的模块化编写大型项目通常包含多个模块,每个模块都有自己的依赖关系和构建规则。

为了更好地组织makefile,可以将每个模块的构建规则分别写在不同的文件中,然后在主makefile中引入这些文件。

这样做可以使makefile更加清晰,便于维护。

如何编写makefile文件

如何编写makefile文件

目的:基本掌握了make 的用法,能在Linux系统上编程。

环境:Linux系统,或者有一台Linux服务器,通过终端连接。

一句话:有Linux编译环境。

准备:准备三个文件:file1.c, file2.c, file2.hfile1.c:#include <stdio.h>#include "file2.h"int main(){printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");File2Print();return 0;}file2.h:#ifndef FILE2_H_#define FILE2_H_#ifdef __cplusplusextern "C" {#endifvoid File2Print();#ifdef __cplusplus}#endif#endiffile2.c:#include "file2.h"void File2Print(){printf("Print file2**********************\n");}基础:先来个例子:有这么个Makefile文件。

(文件和Makefile在同一目录)=== makefile 开始===helloworld:file1.o file2.ogcc file1.o file2.o -o helloworldfile1.o:file1.c file2.hgcc -c file1.c -o file1.ofile2.o:file2.c file2.hgcc -c file2.c -o file2.oclean:rm -rf *.o helloworld=== makefile 结束===一个makefile 主要含有一系列的规则,如下:A: B(tab)<command>(tab)<command>每个命令行前都必须有tab符号。

简单制作Makefile方法

简单制作Makefile方法

1.在当前目录下创建一个名为hello的子目录。hello这个目录用于存放hello.c这个程序及相关文件。新建一个源程序文件hello.c
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Welcome to use autoconf and automake\n");
通过以上步骤,在源代码所在目录下自动生成了Makefile文件。
configure.in文件
autoconf提用来产生"configure"文件的工具。"configure"是一个Shell脚本,它可以自动设定一些编译参数使程序能够在不同平台上进行编译。autoconf读取configure.in文件然后产生,"configure"这个Shell脚本。
如何使用产生的Makefile文件
执行configure脚本文件所产生的Makefile文件有几个预定的选项可供使用。
l make all:产生设定的目标,即生成所有的可执行文件。使用make也可以达到此目的。
l make clean:删除之前编译时生成的可执行文件及目标文件(形如*.o的中间文件)。
configure.in文件的内容是一系列GNU m4的宏,这些宏经autoconf理后会变成检查系统特性的Shell脚本。configure.in文件中宏的顺序并没有特别的规定,但是每一个configure.in文件必须以宏AC_INIT开头,以宏AC_OUTPUT结束。一般可先用autoscan这个工具扫描原始文件以产生一个configure.scan文件,再对configure.scan作些修改,从而生成configure.in文件

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(调试)选项。

makefile文件写法解析

makefile文件写法解析

makefile⽂件写法解析⼀、makefile⽂件⽰例makefile⽂件并不难写,⼀个makefile模版如下所⽰,所有makefile⽂件在此基上稍微修改就可以了。

# this is a makefile #这⼀⾏是注释NAME = MemInfo.exe #下来这⼏⾏是宏定义,相当于linux的变量OBJS = $(NAME).objRES = $(NAME).resLINK_FLAG = /subsystem:windowsML_FLAG = /c /coff$(NAME): $(OBJS) $(RES) #这⼀⾏指出最终⽣成的exe⽂件依赖哪些obj和res⽂件Link $(LINK_FLAG) $(OBJS) $(RES) #这⼀⾏是⽣成exe时执⾏的链接命令;.asm.obj: #这⼀⾏表⽰.asm⽂件转成.obj⽂件要使⽤下边这个语句ml $(ML_FLAG) $< #这⼀⾏是使⽤.asm转.obj的编译命令;$<表⽰对当前⽬录下所有.asm⽂件进⾏编译且编译⽣成的.obj⽂件使⽤和原来.asm⽂件⼀样的名字.rc.res: #这⼀⾏表⽰.rc⽂件转成.res⽂件要使⽤下边这个语句rc $< #这⼀⾏是使⽤.rc转.res的编译命令;$<表⽰对当前⽬录下所有.rc⽂件进⾏编译且编译⽣成的.res⽂件使⽤和原来.rc⽂件⼀样的名字clean: #这⼀⾏表⽰最后要执⾏以下的清除命令del *.obj #删除当前⽬录下的所有.obj⽂件del *.res #删除当前⽬录下的所有.res⽂件⼆、makefile⽂件解读2.1 makefile⽂件的组成我们⼿动编译的过程是:通过rc编译资源⽂件,通过ml编译源⽂件,通过link连接程序。

makefile其实就是⽤于指导make程序完成这⼏件事,makefile就是由obj/res转exe的链接规则、asm转obj的编译规则、rc转res的编译规则和清除中间⽂件的规则等四种规则组成;不过为了⽅便还引⼊了注释和宏定义,这并不难理解。

Makefile 编写详解

Makefile 编写详解

Makefile 编写详解I 概述Makefile 介绍一、Makefile的规则二、一个示例三、make是如何工作的四、makefile中使用变量五、让make自动推导六、另类风格的makefile七、清空目标文件的规则II Makefile 总述一、Makefile里有什么?二、Makefile的文件名三、引用其它的Makefile四、环境变量 MAKEFILES五、make的工作方式III 书写规则一、规则举例二、规则的语法三、在规则中使用通配符四、文件搜寻五、伪目标六、多目标七、静态模式八、自动生成依赖性IV 书写命令一、显示命令二、命令执行三、命令出错四、嵌套执行make五、定义命令包V 使用变量一、变量的基础二、变量中的变量三、变量高级用法四、追加变量值五、override 指示符六、多行变量七、环境变量八、目标变量九、模式变量VI 使用条件判断一、示例二、语法VII 使用函数一、函数的调用语法二、字符串处理函数三、文件名操作函数四、foreach 函数五、if 函数六、call函数七、origin函数八、shell函数九、控制make的函数VIII make 的运行一、make的退出码二、指定Makefile三、指定目标四、检查规则五、make的参数IX 隐含规则一、使用隐含规则二、隐含规则一览三、隐含规则使用的变量四、隐含规则链五、定义模式规则六、老式风格的"后缀规则"七、隐含规则搜索算法X 使用make更新函数库文件一、函数库文件的成员二、函数库成员的隐含规则三、函数库文件的后缀规则四、注意事项后序概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。

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

makefile写法实例

makefile写法实例

makefile写法实例makefile例⼦假设我们有⼀个程序由5个⽂件组成,源代码如下:/*main.c*/#include"mytool1.h"#include"mytool2.h"int main(){mytool1_print("hello mytool1!");mytool2_print("hello mytool2!");return 0;}/*mytool1.c*/#include"mytool1.h"#include<stdio.h>void mytool1_print(char *print_str){printf("This is mytool1 print : %s ", print_str);}/*mytool1.h*/#ifndef _MYTOOL_1_H#define _MYTOOL_1_Hvoid mytool1_print(char *print_str);#endif/*mytool2.c*/#include"mytool2.h"#include<stdio.h>void mytool2_print(char *print_str){printf("This is mytool2 print : %s ", print_str);}/*mytool2.h*/#ifndef _MYTOOL_2_H#define _MYTOOL_2_Hvoid mytool2_print(char *print_str);#endif⾸先了解⼀下make和Makefile。

GNU make是⼀个⼯程管理器,它可以管理较多的⽂件。

我所使⽤的RedHat 9.0的make版本为GNU Make version 3.79.1。

makefile的示例

makefile的示例

makefile的示例Makefile 是一种用于自动化软件构建过程的文件。

它描述了软件项目中各个源文件之间的依赖关系,并指定了如何生成目标文件。

下面是一个简单的 Makefile 示例,用于编译C 语言程序:```makefile# 定义目标文件target: main.o helper.o# 定义编译命令cc -o $@ $^# 定义依赖文件main.o: main.c helper.hcc -c main.chelper.o: helper.c helper.hcc -c helper.c```在这个示例中,我们定义了一个目标文件 `target`,它依赖于两个源文件 `main.o` 和`helper.o`。

我们还指定了如何通过 `cc` 编译器将源文件编译成目标文件。

具体来说,对于每个源文件,我们都定义了一个对应的依赖规则。

例如,`main.o` 依赖于 `main.c` 和 `helper.h`,因此在编译 `main.o` 之前,需要先确保这两个文件存在。

最后,我们使用 `Makefile` 的目标规则来指定如何生成最终的目标文件。

在这个示例中,我们使用 `cc` 编译器将所有的目标文件和源文件链接起来,生成可执行文件。

要使用这个 Makefile,只需在命令行中执行 `make` 命令。

Make 工具会根据 Makefile 中的规则自动执行必要的操作,生成目标文件。

请注意,这只是一个简单的示例,实际的 Makefile 可能会更加复杂,根据项目的具体需求进行配置。

你可以根据自己的项目结构和编译需求来扩展和修改这个示例。

跟我一起写Makefile 可以注释版

跟我一起写Makefile 可以注释版
一、Makefile的规则 ..............................................................................................................7 二、一个示例...........................................................................................................................8 三、make是如何工作的........................................................................................................9 四、makefile中使用变量....................................................................................................10 五、让make自动推导.......................................................................................................... 11 六、另类风格的makefile....................................................................................................12 七、清空目标文件的规则.....................................................................................................13 第四部分、Makefile 总述 ..........................................................................................................13 一、Makefile里有什么? ....................................................................................................13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

跟我一起写 Makefile作者:陈皓整理:祝冬华第一部分、概述 (6)第二部分、关于程序的编译和链接 (6)第三部分、Makefile 介绍 (7)一、Makefile的规则 (7)二、一个示例 (8)三、make是如何工作的 (9)四、makefile中使用变量 (10)五、让make自动推导 (11)六、另类风格的makefile (12)七、清空目标文件的规则 (13)第四部分、Makefile 总述 (13)一、Makefile里有什么? (13)1、显式规则。

(14)2、隐晦规则。

(14)3、变量的定义。

(14)4、文件指示。

(14)5、注释。

(14)二、Makefile的文件名 (15)三、引用其它的Makefile (15)四、环境变量 MAKEFILES (16)五、make的工作方式 (16)第五部分、书写规则 (17)一、规则举例 (17)二、规则的语法 (17)三、在规则中使用通配符 (18)四、文件搜寻 (19)五、伪目标 (20)六、多目标 (22)七、静态模式 (22)八、自动生成依赖性 (24)第六部分书写命令 (25)一、显示命令 (26)二、命令执行 (26)三、命令出错 (27)四、嵌套执行make (28)五、定义命令包 (30)第七部分使用变量 (30)一、变量的基础 (31)二、变量中的变量 (32)三、变量高级用法 (34)四、追加变量值 (37)五、override 指示符 (37)六、多行变量 (38)八、目标变量 (39)九、模式变量 (40)第八部分使用条件判断 (40)一、示例 (40)二、语法 (42)第九部分使用函数 (43)一、函数的调用语法 (44)二、字符串处理函数 (44)1、subst (44)2、patsubst (45)3、strip (45)4、findstring (46)5、filter (46)6、filter-out (46)7、sort (47)8、word (47)9、wordlist (47)10、words (47)11、firstword (48)12、字符串函数实例 (48)三、文件名操作函数 (48)1、dir (48)2、notdir (48)3、suffix (49)4、basename (49)5、addsuffix (49)6、addprefix (49)7、join (50)四、foreach 函数 (50)五、if 函数 (50)六、call函数 (51)七、origin函数 (51)“undefined” (52)“default” (52)“file” (52)“command line” (52)“override” (52)“automatic” (52)八、shell函数 (53)九、控制make的函数 (53)1、error (53)2、warning (54)第十部分 make 的运行 (54)二、指定Makefile (54)三、指定目标 (55)“all” (56)“clean” (56)“install” (56)“print” (56)“tar” (56)“dist” (56)“TAGS” (56)“check”和“test” (56)四、检查规则 (57)五、make的参数 (57)第十一部分隐含规则 (61)一、使用隐含规则 (61)二、隐含规则一览 (62)1、编译C程序的隐含规则 (63)2、编译C++程序的隐含规则 (63)3、编译Pascal程序的隐含规则 (63)4、编译Fortran/Ratfor程序的隐含规则 (63)5、预处理Fortran/Ratfor程序的隐含规则 (63)6、编译Modula-2程序的隐含规则 (63)7、汇编和汇编预处理的隐含规则 (64)8、链接Object文件的隐含规则 (64)9、Yacc C程序时的隐含规则 (64)10、Lex C程序时的隐含规则 (64)11、Lex Ratfor程序时的隐含规则 (65)12、从C程序、Yacc文件或Lex文件创建Lint库的隐含规则 (65)三、隐含规则使用的变量 (65)1、关于命令的变量。

(65)2、关于命令参数的变量 (66)四、隐含规则链 (67)五、定义模式规则 (68)1、模式规则介绍 (68)2、模式规则示例 (69)3、自动化变量 (70)4、模式的匹配 (72)5、重载内建隐含规则 (72)六、老式风格的"后缀规则" (73)七、隐含规则搜索算法 (74)第十二部分使用make更新函数库文件 (75)一、函数库文件的成员 (75)二、函数库成员的隐含规则 (75)三、函数库文件的后缀规则 (76)第十三部分后序 (77)第一部分、概述什么是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)。

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

这里所默认的编译器是UNIX下的GCC和CC。

第二部分、关于程序的编译和链接在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。

然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。

对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。

一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,(O文件或是OBJ 文件)来链接我们的应用程序。

链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。

在编译时,编译器只检测程序语法,和函数、变量是否被声明。

如果函数未被声明,编译器会给出一个警告,但可以生成Object File。

而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。

你需要指定函数的Object File.好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。

第三部分、Makefile 介绍make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明Makefile的书写规则。

以便给大家一个感兴认识。

这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。

我们的规则是:1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程。

3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make编译所需要的文件和链接目标程序。

一、Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target ... : prerequisites ...command......target也就是一个目标文件,可以是Object File,也可以是执行文件。

还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。

(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。

说白一点就是说,prerequisites 中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

相关文档
最新文档