跟我一起写 Makefile
通用makefile的编写
通用makefile的编写Makefile是一种常用的构建工具,它可以通过简洁的语法描述源码的编译和链接过程,方便地实现代码的自动化构建。
在互联网技术领域,Makefile的编写尤为重要,它能帮助开发者管理复杂的项目结构和依赖关系。
本文将介绍通用Makefile的编写方法,帮助读者快速上手。
一、Makefile的基本结构Makefile由一系列规则(Rules)组成,每个规则定义了一个目标(Target)和依赖关系(Prerequisites),以及执行的命令(Commands)。
基本的Makefile结构如下:```target: prerequisitescommand```其中,target表示目标文件,prerequisites表示所依赖的文件,而command则是需要执行的命令。
当目标文件的依赖文件发生变化时,Make工具会自动执行对应的命令以完成构建。
二、Makefile的变量在编写Makefile时,可以使用变量来简化命令的书写和维护。
变量可以用来存储文件名、编译选项等信息。
通过声明变量并在命令中引用,可以提高代码的可读性和可维护性。
变量的声明格式如下:```VARIABLE_NAME = value```在命令中引用变量时,需要使用`$`符号进行替换。
例如,`${VARIABLE_NAME}`表示引用名为`VARIABLE_NAME`的变量。
三、Makefile的规则Makefile中的规则可以根据需要定义多个。
每个规则由一个目标文件、依赖关系和命令组成。
通过定义不同的规则,可以实现对不同文件的编译、链接等操作。
以下是一个示例规则的定义:```main.o: main.cgcc -c -o main.o main.c```上述规则表示要生成`main.o`文件,依赖于`main.c`文件。
命令`gcc -c -o main.o main.c`表示将`main.c`文件编译为`main.o`目标文件。
MakeFile脚本的编写
MakeFile脚本的编写1.Eclipse Debug下默认会⽣成 .mk格式的makefile多⽂件2.下连接可以⽤⼀个⽂件来实现MakeFile功能。
转载⾸先进⾏的内容是参数设置部分,如下:设置项⽬名字,它决定了我们make之后,⽣成的⽂件名。
⽐如libXX.so或者XXX.a或者XXXX#set your project namePRJ_NAME=libXXX.so设置项⽬的类型,是共享库、可执⾏程序还是静态库#set your project type : choose one belowPRJ_TYPE =g++ -shared#PRJ_TYPE = g++#PRJ_TYPE = ar -r设置编译的类型,是Debug还是Release#set Debug or ReleaseCompile_Flag = Debug#Compile_Flag = Release设置编译后的⽂件的输出路径,这个⽂件夹⼀定要有才可以,否则会出错的。
所以要事先建⽴好#set your output pathOutput:= bin这⾥是设置代码所在的⽂件夹#set your source folderSRC:=code如果引⽤了什么库,就在这⾥添加好了.#add the lib you used here#LIBS := -lLib1 -lLib2 -lLib3LIBS := -lpthread#LIBPATH := -Lpath1 -Lpath2 -Lpath3LIBPATH :=INCLUDEPATH :=# INCLUDEPATH := -I/usr/lib/XXX/include要设置的参数就这么多。
下⾯进⼊第⼆部分,makefile核⼼内容的解释。
下⾯我仔细讲⼀下。
#符号,表⽰注释。
makefile⾥⾯有它的那⾏,就不会起作⽤了。
⽐如下⾯两⾏就是注释。
####################################DON"T MODIFY THE BELOWS#combine output folderFinalOutput := $(Output)/$(Compile_Flag)/上⾯的代码,定义了⼀个变量,名字是FinalOutput,给它赋值,可以⽤=或者:=,等⼀下说区别。
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是一种用于自动化构建和管理项目的工具,它使用一种被称为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。
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 是代码构建和自动化构建的重要工具,它可以帮助我们高效、准确地管理和构建程序。
在本文中,我将和大家分享几种常见的Makefile 写法,以及一些有用的技巧和注意事项。
1. Makefile 的基本结构Makefile 中包含了以下基本结构:```target: dependencies<tab> command```其中,target 表示目标文件或目标任务名称;dependencies 表示该目标文件或任务所依赖的文件或任务;command 表示需要执行的命令。
比如,下面是一个简单的 Makefile 例子:```all: testtest: main.o func.o<tab> gcc main.o func.o -o testmain.o: main.c<tab> gcc -c main.c -o main.ofunc.o: func.c func.h<tab> gcc -c func.c -o func.o```其中,目标文件 all 是 Makefile 的默认目标,执行 make 命令时会自动执行 all 目标中所列出的任务。
在本例中,all 的唯一任务是test。
test 任务需要依赖 main.o 和 func.o,如果这两个文件不被更新,则 test 任务不会被重新构建。
2. Makefile 的变量在 Makefile 中,我们可以定义变量来方便地管理代码中的重复部分。
变量可以在任何位置使用,使得代码更加清晰易读,同时也方便了维护。
变量的定义格式是:```变量名 = 值```例如:```CC = gccCFLAGS = -Wall -g```在 Makefile 内使用变量的格式是 $+变量名。
例如:```all: testtest: main.o func.o<tab> $(CC) main.o func.o -o test $(CFLAGS)main.o: main.c<tab> $(CC) -c main.c -o main.o $(CFLAGS)func.o: func.c func.h<tab> $(CC) -c func.c -o func.o $(CFLAGS)```在本例中,我们定义了两个变量,CC 和 CFLAGS。
单片机makefile编写 -回复
单片机makefile编写-回复单片机(Microcontroller)是一种嵌入式系统中常见的硬件设备,它集成了中央处理器(CPU)、内存、输入输出接口以及各种外设功能于一体。
单片机广泛应用于家电、汽车、通讯、电子游戏等领域,具有体积小、功耗低、性能强等优势。
在单片机的开发过程中,为了方便管理和构建项目代码,使用Makefile是一种常见的做法。
本文将从头开始介绍如何编写单片机的Makefile。
一、什么是MakefileMakefile是一种用于自动化编译和构建代码的脚本文件。
它可以根据源代码的改变自动确定需要重新编译的文件,并执行相应的编译和链接操作。
Makefile使用一种特定的语法规则,描述了源文件之间的依赖关系和构建规则,从而实现代码的自动构建。
二、Makefile的基本语法1. 注释在Makefile中,注释以"#"开头,可以用于对代码进行解释和说明,提高代码的可读性。
2. 变量变量用于存储和管理需要在Makefile中多次使用的数据。
可以使用"="或":="进行赋值,并使用""符号进行引用。
3. 关键字Makefile中存在一些特定的关键字,用于定义和控制代码的构建过程。
例如:- "CC":指定编译器的名称;- "CFLAGS":设置编译器的参数;- "LDFLAGS":设置链接器的参数;- "RM":指定删除文件的命令。
4. 目标规则Makefile中的目标规则描述了代码的编译和构建过程。
每个目标规则由目标文件、依赖文件和构建命令组成。
例如:ctarget: dependenciescommand其中,"target"表示目标文件名,"dependencies"表示依赖文件(源代码文件或中间文件),"command"表示构建命令。
如何编写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 gcc编译
makefile gcc编译
Makefile 是一个用来组织代码编译的工具,而 GCC 是一个常用的 C 和 C++ 编译器。
在 Makefile 中使用 GCC 进行编译可以通过以下步骤完成:
1. 创建一个名为 "Makefile" 的文本文件,并确保它位于你的项目根目录下。
2. 在 Makefile 中定义你的编译规则。
例如,假设你有一个名为 "main.c" 的源文件需要编译成可执行文件 "app",你可以这样编写 Makefile:
make.
app: main.c.
gcc -o app main.c.
在这个例子中,我们定义了一个名为 "app" 的目标,它依赖于"main.c" 这个源文件。
当你运行 "make" 命令时,Make 工具会根
据这个规则来执行编译。
3. 打开终端,进入到包含 Makefile 的项目目录下。
4. 运行命令 "make"。
Make 工具会读取 Makefile 文件,并执行其中定义的编译规则。
在这个例子中,它会使用 GCC 编译器来编译 "main.c" 并生成可执行文件 "app"。
需要注意的是,Makefile 可以包含更复杂的规则和变量定义,以及支持多个源文件的编译。
你可以根据你的项目需求来进一步扩展和定制 Makefile 文件。
总之,通过合理编写 Makefile 并结合使用 GCC 编译器,你可以高效地组织和管理你的代码编译过程。
简单制作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文件
makefile典型模板
makefile典型模板Makefile典型模板Sunny.man1.写在前⾯在这篇⽂章之前,曾经因为⾃⼰学习makefile⽂件写了⼀个笔记,笔记中简单的传述了⽂件的书写规范,我把此笔记上传⾯了⼀个⽂档,此⽂档不能称为⼀个合格的⽂档。
我在实际的使⽤过程中才发现,⽤上述⽂档来编写⼀个合格的makefile⽂件是远远不够的,为此我写了⼀个makefile模块供⼤家改写,毕竟我们要写的是应⽤程序⽽不是⼀个makefile⽂件。
我在学习makefile的过程中查阅了很多的资料,⾛了不少的弯路。
为了同⾏们把宝贵的时间⽤在⾃⼰的应⽤程序开发上,我写了这篇⽂档。
Makefile的要求如下1.快速编译,不更新的⽂件不重新编译。
2.当⼀个.c⽂件做修改时不需要⼿动添加依赖。
3.源⽂件放⼀个⽬录,头⽂件放⼀个⽬录,依赖放⼀个⽬录,⽬标⼀个⽬录。
4.头⽂件的修改会⾃动重新编译所有引⽤它的.c⽂件5.这个makefile⽂件⼀定是没有错误可以运⾏的,我认为这⼀点太重要的。
我在⽹上查的许多⽂件都根本不能运⾏,好多的⽂章代码部分都是⼀样的,难道只是转载的吗?2.直接上代码3.⼀些必要的解译3.1宏定义其实make本⾝已有许多的default的macro,如果要查看这些macro的话,可以⽤make -p的命令.这⾥不做过多解释。
3.2>debug.txt 2>&1把输出和错误重新定位到⽂件debug.txt3.3makefile中的函数makefile⾥的函数使⽤,和取变量的值类似,是以⼀个‘$’开始,然后是⼀个括号⾥⾯是函数名和需要的参数列表,多个变量⽤逗号隔开,像这样return = $(functionname arg1,arg2,arg3...)。
3.4$(wildcard $(SRCPATH)*.c)$(wildcard PATTERN...) ,在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(调试)选项。
vivado makefile文件编写实例
vivado makefile文件编写实例如何编写Vivado Makefile 文件。
Vivado 是一款由Xilinx 公司开发的集成电路设计工具,它提供了丰富的设计和仿真功能,可以用于设计和验证各种数字电路。
Makefile 是一种用于自动化构建和管理项目的文件,它可以定义编译、链接和运行等操作的规则。
在Vivado 中使用Makefile 可以方便地管理项目的编译和仿真过程,提高开发效率。
本文将以中括号内的内容为主题,一步一步回答如何编写Vivado Makefile 文件。
一、创建Makefile 文件首先,在Vivado 工程目录下创建一个名为Makefile 的文件。
可以使用文本编辑器或者命令行工具创建该文件。
二、Makefile 基本结构Makefile 是按照一定的规则编写的,它由一系列的规则定义组成,每个规则包含一个或多个目标、依赖和命令。
规则的语法如下:target: dependenciescommand其中,target 是规则的目标,dependencies 是目标的依赖,command 是执行的命令。
三、Vivado Makefile 常用规则1. all:编译和仿真整个工程all: build sim上述规则定义了一个名为all 的目标,它依赖于build 和sim 两个目标,执行的命令为空。
2. build:编译工程build:vivado -mode batch -source build.tcl上述规则定义了一个名为build 的目标,它执行vivado 命令,并传入-mode batch 和-source build.tcl 两个参数。
这里的build.tcl 是一个Vivado Tcl 脚本,用于自动化执行编译操作。
3. sim:仿真工程sim:vivado -mode batch -source sim.tcl上述规则定义了一个名为sim 的目标,它执行vivado 命令,并传入-mode batch 和-source sim.tcl 两个参数。
教会你如何编写makefile文件
教会你如何编写makefile文件最近一直在学习makefile是如何编写的。
当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷。
linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件。
makefile是一种特殊的文件格式,他将会帮你自动管理你的项目,很强大。
下面通过实例一步步讲解如何使用makefile。
下面的四段代码。
//main.cpp#include "functions.h"int main(){print_hello();cout << endl;cout << "The factorial of 5 is " << factorial(5) << endl;return 0;}//hello.cpp#include "functions.h"void print_hello(){cout << "Hello World!";}///factorial.cpp#include "functions.h"int factorial(int n){if(n!=1){ return(n * factorial(n-1)); }else return 1;}//functions.hvoidprint_hello();int factorial(int n);请将以上文件放到一个目录下。
请注意: 我用的是g++进行编译的,你也可以按照你自己的选择来编译程序make的作用如果你运行: make命令,它将会自动的在你的目录下寻找makefile文件,然后执行它,如果你几个makefile文件,你可以指定某一个特定的makefile文件使用如下命令:make -f mymakefile如果你想知道更多的make 用法,可以执行man make 命令执行过程编译器将会编译你的源文件,然后输出目标文件链接器执行目标文件然后创建一个可执行文件。
陈皓-跟我一起写Makefile
跟我一起写 Makefile陈皓 (CSDN)概述——什么是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 标准的(POSI X.2)。
在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。
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文件编写详解——WangYiwei 利用makefile工具可以自动完成编译工作。
如果仅修改了几个源文件,则只重新编译这几个源文件,其他没有修改的不再去编译。
如果某个头文件被修改,则只重新编译包含这几个头文件的源文件。
因此可以简化开发工作。
格式:TARGET(目标) :DEPENDENCIES(依赖)COMMOND(命令)目标:程序要产生的文件,如可执行文件和目标文件。
目标也可以是要执行的动作,如clean也成为伪目标。
依赖:是用来产生目标输入文件列表,一个目标通常依赖于多个文件。
命令:是make执行的动作(命令是shell命令或是可在shell下执行的程序)。
注意:每个命令行的起始字符都是table字符$@ 规则目标文件名$< 规则第一个依赖文件名$^ 规则的所有文件列表例子:(1)生成一个可执行文件:说明:在01目录下有main.c sub.c sub.h add.c add.h Makefile,以下部分是Makefile的内容①简单的例子.PHONY: clean#显示地指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作main: main.o add.o sub.ogcc main.o add.o sub.o -o mainmain.o: main.c add.h sub.hgcc -c main.c -o main.oadd.o: add.c add.hgcc -c add.c -o add.osub.o: sub.c sub.hgcc -c sub.c -o sub.oclean:@echo "remove file ..."rm main main.o add.o sub.o②利用自定义变量和自动化变量.PHONY: clean#显示的指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作OBJECTS = main.o add.o sub.o#自定义变量main: $(OBJECTS)gcc -Wall -g $^ -o $@main.o: main.c add.h sub.hgcc -Wall -g -c $< -o $@add.o: add.c add.hgcc -Wall -g -c $< -o $@sub.o: sub.c sub.hgcc -Wall -g -c $< -o $@clean:@echo "remove file ..."#在命令前加@表示不显示命令rm -f main $(OBJECTS)(2)生成多个可执行文件说明:在02目录下有01test.c 02test.c 03test.c Makefile,以下部分是Makefile 的内容①默认规则.PHONY: all clean#显示的指出clean为伪目标,防止当前目录下存在clean文件,不能进行清理工作CC = gccCFLAGS = -Wall -gBIN = 01test 02test 03testall: $(BIN)clean:@echo "Begin remove ..."rm -f $(BIN)执行之后生成01test 02test 03test可执行文件,系统执行的是隐含推导规则,也可以自己编写推导规则。
Makefile简单编写
Makefile 惯例下面是Makefile中一些约定俗成的目标名称及其含义:all编译整个软件包,但不重建任何文档。
一般此目标作为默认的终极目标。
此目标一般对所有源程序的编译和连接使用"-g"选项,以使最终的可执行程序中包含调试信息。
可使用strip 程序去掉这些调试符号。
clean清除当前目录下在make 过程中产生的文件。
它不能删除软件包的配置文件,也不能删除build 时创建的那些文件。
distclean类似于"clean",但增加删除当前目录下的的配置文件、build 过程产生的文件。
info产生必要的Info 文档。
check 或test完成所有的自检功能。
在执行检查之前,应确保所有程序已经被创建(但可以尚未安装)。
为了进行测试,需要实现在程序没有安装的情况下被执行的测试命令。
install完成程序的编译并将最终的可执行程序、库文件等拷贝到指定的目录。
此种安装一般不对可执行程序进行strip 操作。
install-strip和"install"类似,但是会对复制到安装目录下的可执行文件进行strip 操作。
uninstall删除所有由"install"安装的文件。
installcheck执行安装检查。
在执行安装检查之前,需要确保所有程序已经被创建并且被安装。
installdirs创建安装目录及其子目录。
它不能更改软件的编译目录,而仅仅是创建程序的安装目录。
下面是Makefile 中一些约定俗成的变量名称及其含义:这些约定俗成的变量分为三类。
第一类代表可执行程序的名字,例如CC 代表编译器这个可执行程序;第二类代表程序使用的参数(多个参数使用空格分开),例如CFLAGS 代表编译器执行时使用的参数(一种怪异的做法是直接在CC 中包含参数);第三类代表安装目录,例如prefix 等等,含义简单,下面只列出它们的默认值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Makefile学习教程: 跟我一起写Makefile0 Makefile概述0.1 关于程序的编译和链接1 Makefile 介绍1.1 Makefile的规则1.2 一个示例1.3 make是如何工作的1.4 makefile中使用变量1.5 让make自动推导1.6 另类风格的makefile1.7 清空目标文件的规则2 Makefile 总述2.1 Makefile里有什么?2.2Makefile的文件名2.3 引用其它的Makefile2.4 环境变量MAKEFILES2.5 make的工作方式3 Makefile书写规则3.1 规则举例3.2 规则的语法3.3 在规则中使用通配符3.4 文件搜寻3.5 伪目标3.6 多目标3.7 静态模式3.8 自动生成依赖性4 Makefile 书写命令4.1 显示命令4.2 命令执行4.3 命令出错4.4 嵌套执行make4.5 定义命令包0 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++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。
这里所默认的编译器是UNIX 下的GCC和CC。
0.1 关于程序的编译和链接在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是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有许多的内容,闲言少叙,还是让我们开始吧。
1 Makefile 介绍--------------------------------------------------------------------------------make命令执行时,需要一个Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,我们用一个示例来说明Makefile的书写规则。
以便给大家一个感兴认识。
这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。
我们的规则是:如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make 命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。
1.1 Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。
target ... : prerequisites ...command......target也就是一个目标文件,可以是Object File,也可以是执行文件。
还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。
(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在command中。
说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
这就是Makefile的规则。
也就是Makefile中最核心的内容。
说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。
呵呵。
还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。
内容还多着呢。
:)1.2 一个示例正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。
edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o cc -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”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。
如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下“make clean”就可以了。
在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些.c 文件和.h文件。
每一个.o 文件都有一组依赖文件,而这些.o 文件又是执行文件edit 的依赖文件。
依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。
在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。
记住,make并不管命令是怎么工作的,他只管执行所定义的命令。
make 会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets 文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。