Makefile 使用总结 - wang_yb - 博客园
makefile的用法

makefile的用法Makefile是一种用于自动化编译程序的工具,它可以根据源代码文件的依赖关系,自动编译出最终的可执行文件。
Makefile的使用可以大大提高程序的开发效率和可维护性,下面我们来详细了解一下Makefile的用法。
一、Makefile的基本语法Makefile的基本语法由一系列规则组成,每个规则由以下几部分组成:1. 目标(Target):表示需要生成的文件名或者是一个伪目标,如clean。
2. 依赖(Prerequisites):表示生成目标所依赖的文件或者是其他目标。
3. 命令(Command):表示生成目标的具体命令。
例如,下面是一个简单的Makefile规则:```hello: main.o hello.ogcc -o hello main.o hello.omain.o: main.cgcc -c main.chello.o: hello.cgcc -c hello.c```这个Makefile规则表示需要生成一个名为hello的可执行文件,它依赖于main.o和hello.o两个目标文件。
生成hello文件的具体命令是gcc -o hello main.o hello.o。
同时,main.o和hello.o两个目标文件分别依赖于main.c和hello.c两个源代码文件,生成它们的具体命令是gcc -c main.c和gcc -c hello.c。
二、Makefile的常用命令1. make:执行Makefile文件,生成目标文件。
2. make clean:删除所有生成的目标文件。
3. make install:将生成的目标文件安装到指定的目录中。
4. make uninstall:卸载已经安装的目标文件。
5. make help:显示Makefile文件中定义的所有规则。
三、Makefile的高级用法1. 变量Makefile中可以定义变量,用于存储一些常用的参数或者路径。
makefile输出总结

makefile输出总结【原创版】目录1.Makefile 简介2.Makefile 的输出3.Makefile 输出的格式4.Makefile 输出的优点5.总结正文1.Makefile 简介Makefile 是一种构建脚本,用于自动化构建和编译软件项目。
它通常包含一系列的规则和指令,用于描述项目的构建过程。
Makefile 最早用于 Unix 系统,但现在已经广泛应用于各种操作系统和编程语言中。
2.Makefile 的输出Makefile 的输出是指在执行 Makefile 后,系统生成的文件或结果。
这些输出通常包括编译后的目标文件、可执行文件和库文件等。
Makefile 的输出可以帮助开发者快速了解项目的构建状态,以便进行调试和测试。
3.Makefile 输出的格式Makefile 的输出格式通常遵循一定的规范,例如在输出文件名前加上“@”符号,表示该文件是由 Makefile 生成的。
另外,Makefile 还可以通过设置输出变量,来控制输出的格式和内容。
4.Makefile 输出的优点Makefile 输出的优点主要体现在以下几个方面:(1)自动化:Makefile 可以自动化执行构建过程,提高开发效率。
(2)可维护性:Makefile 可以将项目的构建过程描述得非常清晰,便于维护和修改。
(3)可扩展性:Makefile 可以通过调用其他脚本和程序,来实现更复杂的构建逻辑。
(4)跨平台性:Makefile 可以在各种操作系统和编程语言中使用,具有一定的通用性。
5.总结总之,Makefile 是一种非常实用的构建脚本工具,可以帮助开发者自动化项目的构建过程,提高工作效率。
python makefile 用法

python makefile 用法Python Makefile可用于自动化编译,构建和测试Python项目。
它是一个命令脚本,帮助程序员在不同的操作系统上拥有相同的构建环境,减少了跨平台应用的开发难度。
本文将详细介绍Python Makefile的使用方法,包括如何创建,配置和使用Makefile,以及常见的Makefile命令和技巧。
创建Python Makefile要创建Python Makefile,您需要使用任何文本编辑器创建一个Makefile文件。
Makefile文件通常命名为Makefile或makefile,并位于项目根目录中。
在Makefile文件中,您需要定义一组规则,以指定每个目标的依赖关系,命令和操作。
以下是一个简单的Makefile示例,用于编译和执行名为myapp.py的Python 应用程序。
```make # Makefile for the myapp Python application# Define the application file APPNAME = myapp.py # Define the Python interpreter PYTHON = python3all: $(PYTHON) $(APPNAME)# Define the clean rule clean: rm -f *.pyc ```在上面的Makefile中,我们定义了两个规则,一个是`all`,另一个是`clean`。
`all`规则定义如何构建我们的应用程序,`clean`规则定义如何清理构建期间生成的文件。
配置Python Makefile在编写Python Makefile时,您需要配置Python解释器和其他环境变量。
以下是一些常见的Makefile变量和用法:- **PYTHON**:Python解释器的命令。
在大多数情况下,它需要设置为python3。
- **PYFLAGS**:Python解释器的选项和参数,例如“-O”(优化),“-m”(运行包的主模块)等。
python makefile 用法

python makefile 用法在使用Python编写程序时,我们通常需要编译和运行代码,这就需要用到makefile。
makefile是一种可以自动化地构建程序的工具,它可以根据代码修改的情况自动判断哪些文件需要重新编译,从而提高程序的编译效率。
使用makefile的基本步骤如下:1. 创建一个名为makefile的文件,通常放在程序的根目录下。
2. 在makefile中定义一些变量,如编译器、编译选项等。
3. 定义一些规则,如编译规则、目标规则等。
4. 运行make命令,根据makefile的规则进行编译和链接。
下面是一个简单的makefile示例:```# 定义编译器和编译选项CC=gccCFLAGS=-Wall -g# 定义编译规则%.o: %.c$(CC) $(CFLAGS) -c $< -o $@# 定义目标规则main: main.o sub.o$(CC) $(CFLAGS) main.o sub.o -o main# 清除中间文件clean:rm -f *.o main```在这个示例中,我们定义了两个变量CC和CFLAGS,分别表示编译器和编译选项。
接着定义了一个编译规则,表示将.c文件编译成.o文件的过程。
其中,$<表示依赖文件(即输入文件),$@表示目标文件(即输出文件)。
最后定义了一个目标规则,表示将main.o和sub.o链接成可执行文件main。
最后,我们定义了一个清除中间文件的规则,可以通过运行make clean来清除中间文件。
可以通过运行make命令来编译和链接程序。
例如,如果你有一个名为main.c和sub.c的源文件,并想将它们编译成可执行文件main,可以在终端中输入以下命令:```$ make main```这将根据makefile中定义的规则自动编译和链接程序,并生成可执行文件main。
总之,makefile是一个非常有用的编译工具,可以帮助我们自动化地构建程序,提高编译效率。
makefile 语法

makefile 语法makefile是一种常用的自动化构建工具,它可以帮助我们将源代码编译、链接、打包等一系列操作自动化完成。
在软件开发中,makefile 已经成为了不可或缺的工具之一。
本文将介绍 makefile的语法及其用法,希望能够帮助读者更好地理解和使用 makefile。
一、makefile 的基本语法makefile 的基本语法包括目标、依赖、命令三个要素。
下面我们来逐一介绍。
1. 目标目标是指要生成的文件,也就是 makefile 的最终输出。
目标通常是一个可执行文件、一个库文件或者一个归档文件。
在 makefile 中,目标通常以文件名的形式出现。
例如:```app: main.c func.c```这里的“app”就是目标。
2. 依赖依赖是指生成目标所需要的文件或者其他目标。
在 makefile 中,依赖通常以文件名的形式出现。
例如:```app: main.c func.c```这里的“main.c”和“func.c”就是依赖。
3. 命令命令是指生成目标所需要执行的命令。
在 makefile 中,命令通常以“TAB”键开头,并且必须与目标或者依赖之间有一个空格。
例如:```app: main.c func.cgcc main.c func.c -o app```这里的命令是“gcc main.c func.c -o app”。
二、makefile 的实例了解了 makefile 的基本语法后,我们来看一个简单的makefile 实例:```app: main.c func.cgcc main.c func.c -o app```这个 makefile 的作用是将“main.c”和“func.c”编译成一个可执行文件“app”。
如果我们在命令行中执行“make”命令,make 就会自动根据 makefile 中的规则来生成目标文件“app”。
三、makefile 的高级语法除了基本语法之外,makefile 还有一些高级语法,如变量、函数、条件语句等。
makefile 用法及搭配

Makefile 是一个用于自动编译和链接的配置文件,它通常用于管理大型项目的编译过程。
Makefile 定义了一系列的规则和依赖关系,用于指定如何生成目标文件。
Makefile 的基本用法如下:1. 定义目标文件:在Makefile 中,每个规则都有一个目标文件,这个目标文件是规则中所有命令的输出文件。
目标文件使用空格分隔,每个目标文件之间用tab 键进行缩进。
2. 定义依赖文件:规则中的依赖文件是生成目标文件所需的文件。
如果没有找到这些依赖文件,规则中的命令将不会被执行。
3. 定义命令:规则中的命令是用来生成目标文件的。
在命令前必须有一个tab 键进行缩进。
在Makefile 中,还可以使用伪目标(phony target)来指定特定的动作或命令,而不需要生成任何文件。
例如,可以使用“clean”作为伪目标,执行清理操作的命令。
下面是一个简单的Makefile 的例子:```makefile# 目标文件:main.omain.o: main.cgcc -c main.c -o main.o# 目标文件:mainmain: main.ogcc main.o -o main```这个Makefile 定义了两个规则:一个是生成main.o 目标文件,另一个是生成main 目标文件。
生成main.o 目标文件需要main.c 文件作为依赖文件,并执行gcc -c main.c -o main.o 命令。
生成main 目标文件需要main.o 文件作为依赖文件,并执行gcc main.o -o main 命令。
使用Makefile 时,需要注意以下几点:1. Makefile 的语法非常简单,但要编写高效的Makefile 需要对项目的结构和依赖关系有深入的了解。
2. Makefile 中的规则必须遵循一定的格式,否则无法正确执行。
3. 在Makefile 中使用变量和条件语句可以提高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文件中的规则和依赖关系来编译源代码文件并生成目标文件和可执行文件。
makefile

1:在编译时,编译器只检测语法和函数、变量是否声明如果函数未被声明,编译器会给出一个警告,但可以生成object file2:makefile的规则:如果依赖文件比目标文件新的话或者目标文件不存在,就会执行后续定义的命令这里会比较它们的修改日期如果工程没有编译过,所有c文件都会被编译链接如果只是工程的某几个c文件被修改,那么只编译这几个如果头文件被修改,那么只编译包含头文件的c文件3:make是怎样工作的3.1:读入所有的Makefile读入被include的Makefile在当前目录下面找名字为”Makefile”或”makefile”的文件make 执行时-l后面参数指定的目录3.2初始化文件中的变量3.3:推导隐晦规则,并分析所有规则3.4:为所有的目标文件创建依赖关系链3.3:找第一个目标文件3.4:如果目标文件不存在或者依赖文件比目标文件新,就会执行下一行的命令否则就不会执行下一行的命令而是去寻找依赖文件的依赖3.5:得到新的依赖文件后,由于依赖文件比目标文件新,所以就会执行目标文件中的下一行的命令3.5:所有说目标文件的相关命令是最后被执行的4:清空目标文件的规则伪目标不是文件,无法生成它的依赖文件和决定它是否要执行我们只有显示的指明这个目标才能让其生效.PHONY表明是否有这个文件,这个目标就是一个伪目标.PHONY:cleanclean:-rm edit $(objects)#加上一个减号的含义是:某些文件会出问题但不影响后续操作5:通配符~和HOME$<:所有的依赖集$@:目标集6:文件搜寻:当前目录;也可以在文件前加上路径;VPATH执行的路径,多个路径间用冒号关键字vpath指定不同的文件在不同的目录<pattern>需要包含% 字符vpath <pattern> <dir>vpath <pattern>清除符合模式的文件的搜索目录vpath 清除已经设置好的文件搜索目录7:静态模式<targets...>:<target-pattern...>:<prerq-pattern...>objects = foo.o bar.o$(objects): %.o: %.c#target定义了一系列的目标文件,是目标的一个集合#prerq-pattern是目标的依赖的模式,它是对target-pattern形成的模式在进行一次依赖目标的定义#其计算方法是,取<target-parrtern>模式中的“%”(也就是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合自动生成依赖性:为每一个 name.c的文件生成一个 name.d的文件[.d]文件中存放着[.c]文件的依赖关系%.d:%.c@set -e;rm -f $@;\$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\rm -f $@.$$$$sed命令的显示:https:///edwardlost/archive/2010/09/17/1829145.html目的:在编译器生成的依赖关系中加入[.d]文件的依赖main.o : main.c defs.h替换为:main.o main.d: main.c defs.h把自动生成的Makefile加入到我们的Makefile中sources = foo.c bar.cinclude $(sources:.c=.d)8:显示命令:命令前加上@则不会显示make 参数-s 则会全面机制参数的显示make -n 或者--just-print 只是显示命令不会执行适合用来调试make -w 在进入每一个子makefile会显示工作目录,-C 参数默认加上-w9:命令的依赖:两条命令之间用分号,而不是单独的两行10:嵌套执行makeSubsys:cd sub && make等同于make -C sub总控的makefile的变量会传递到下面的makefile(如果显示声明)export variable但是不会覆盖下面的makefile,除非加上参数-e如果传递所有的变量export如果不想传递某个变量unexport varible11:变量的定义A=${b} #右侧中的变量并不一定是已经定义好的变量造成的问题是:死锁A:=$(B) #右侧的变量必须是已经定义好的FOO ?= bar #如果左侧的变量已经被定义,则什么都不做,如果没有被定义就会定义A += B 属于变量的追加12:变量替换的两种方法${var:a=b} 例如foo := a.o b.o c.obar := $(foo:.o=.c)${var:%.o:%.c}12:函数的调用语法:${<function> <arguments>}函数名和参数之间用空格隔开,参数之间用逗号13:字符串处理函数$(subst <from>,<to>,<text> )$(patsubst <pattern>,<replacement>,<text> )#$(patsubst %.c,%.o,x.c.c bar.c)$(strip <string> )功能:去掉<string>字串中开头和结尾的空字符$(findstring <find>,<in> )功能:在字串<in>中查找<find>字串$(filter <pattern...>,<text> )以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
# Makefile内容 OBJS2 = $(OBJS1) programC.o OBJS1 = programA.o programB.o all: @echo $(OBJS2) # bash中执行 make, 可以看出虽然 OBJS1 是在 OBJS2 之后定义的, 但在 OBJS2中可以提前使用 $ make programA.o programB.o programC.o
我的标签
linux (63) linux-kernel (30) CLR via C#笔记 (24) C#学习 (9) puppet (8) C#疑难杂症 (7)
prerequisites - 生成 target 所需要的文件或者目标
1. 显示规则 :: 说明如何生成一个或多个目标文件 (包括 生成的文件 , 文件的依赖文件 , 生成的 命令 ) 2. 隐晦规则 :: make的自动推导功能所执行的规则 3. 变量定义 :: Makefile中定义的变量 4. 文件指示 :: Makefile中引用其他 Makefile; 指定 Makefile中有效部分 ; 定义一个多行命 令 5. 注释 :: Makefile只有行注释 "#", 如果要使用或者输出 "#"字符 , 需要进行转义 , "\#"
vpath <pattern> <directories> :: 符合<pattern>格式的文件, 就从<directories>中搜索
3. Re:《Linux内核设计与实…
楼主好,书上说内核中内存不分 页,那么又有主内核页全局目录中的 内核页表,我不太理解 --找尾巴的猫m
4. Re:Django使用心得(一)
Makefile 使用总结 - wang_yb - 博客园
2013年6月 (1) 2013年5月 (3) 2013年4月 (6) 2012年9月 (2) 2012年8月 (4) 2012年7月 (3) 2012年6月 (1) 2012年1月 (1) 2011年12月 (2) 2011年11月 (4) 2011年10月 (2) 2011年9月 (1) 2011年8月 (2) 2011年7月 (9) 2011年6月 (5) 2011年5月 (3) 2011年4月 (9)
测试 :=
# Makefile内容 OBJS2 := $(OBJS1) programC.o OBJS1 := programA.o programB.o all: @echo $(OBJS2) # bash中执行 make, 可以看出 OBJS2 中的 $(OBJS1) 为空 $ make programC.o
[...] :: ex. [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符, [0-9]表 示 0~9中任意一个数字 ~ :: 表示用户的home目录
积分与排名
积分 - 88238 排名 - 1831
2.1.3 路径搜索
当一个Makefile中涉及到大量源文件时(这些源文件和Makefile极有可能不在同一个目录中), 这时, 最好将源文件的路径明确在Makefile中, 便于编译时查找. Makefile中有个特殊的变量 VPATH 就 是完成这个功能的. 指定了 VPATH 之后, 如果当前目录中没有找到相应文件或依赖的文件, Makefile 回到 VPATH 指定的 路径中再去查找.. VPATH 使用方法: vpath <directories> vpath <pattern> vpath :: 当前目录中找不到文件时, 就从<directories>中搜索 :: 清除符合<pattern>格式的文件搜索路径 :: 清除所有已经设置好的文件路径
5. Re:Django使用心得(一)
@wang_yb你是工作中用到这 些框架的,还是自己感兴趣自学的? 我是最近在看python的东西看到 的。还不清楚django的应用场 景。... --呆雁
2.2 Makefile 中的变量
2.2.1 变量定义 ( = or := )
OBJS = programA.o programB.o OBJS-ADD = $(OBJS) programC.o # 或者 OBJS := programA.o programB.o OBJS-ADD := $(OBJS) progride
作用是使 Makefile中定义的变量能够覆盖 make 命令参数中指定的变量
/wang_yb/p/3990952.html
3/19
2015年3月12日
语法: override <variable> = <value> override <variable> := <value> override <variable> += <value>
最新评论
1. Re:C#操作Excel总结
@蜡笔小青不好意思, 我有5, 6 年没搞过windows和excel, 现在有 没有这套环境可以实验了...... --wang_yb
2. Re:C#操作Excel总结
你好,请问下Excel单元格里面 加下拉选项,怎样设置下拉选项的字 体大小,非常感谢,请回复我邮件 吧:379314367@ --蜡笔小青
阅读排行榜
1. C#操作Excel总结(18556) 2. IIS 403错误详细原因(15… 3. C# 连接Oracle(利用OD… 4. Django使用心得(一)(… 5. 深刻理解C#的传值调用和…
评论排行榜
1. C# 连接Oracle(利用OD… 2. Petapoco 连接oracle11…
或者
target ... : prerequisites ; command command ...
*注 * command太长, 可以用 "\" 作为换行符
2.1.2 规则中的通配符
* ? :: 表示任意一个或多个字符 :: 表示任意一个字符
2010年6月 (7) 2010年5月 (9) 2010年4月 (3)
2.2.3 变量追加值 +=
# Makefile内容 SRCS := programA.c programB.c programC.c SRCS += programD.c all: @echo "SRCS: " $(SRCS) # bash中运行make $ make SRCS: programA.c programB.c programC.c programD.c
# 示例1 - 当前目录中找不到文件时, 按顺序从 src目录 ../parent-dir目录中查找文件 VPATH src:../parent-dir # 示例2 - .h结尾的文件都从 ./header 目录中查找 VPATH %.h ./header # 示例3 - 清除示例2中设置的规则 VPATH %.h # 示例4 - 清除所有VPATH的设置 VPATH @呆雁我是工作用uliweb, 这个 也是我粗略比较了django和uliweb 之后选择的.django就是web框架, 和 ROR, MVC等等是一类 的.... --wang_yb
< 日 1 8 一 2 9
2015年3月 二 3 三 4 四 26 5 12 19 26 2 五 27 6 13 20 27 3
> 六 28 7 14 21 28 4
22 23 24 25 10 11
15 16 17 18 22 23 24 25 29 30 31 1
搜索
本篇博客是基于 {精华} 跟我一起写 Makefile 而整理的, 有些删减, 追加了一些示例. 非常感谢 gunguymadman_cu 提供如此详尽的Makefile介绍, 这正是我一直寻找的Makefile中文文档.
javascript学习 (6) C学习 (4) django框架 (4) mono (2) 更多
随笔档案(166)
2015年3月 (1) 2015年2月 (2) 2015年1月 (7) 2014年11月 (1) 2014年10月 (1) 2014年9月 (4) 2014年8月 (3) 2014年7月 (11) 2014年6月 (40) 2014年5月 (7) 2014年4月 (1) 2014年3月 (1) 2014年1月 (6) 2013年12月 (1) 2013年11月 (1) 2013年10月 (1) 2013年9月 (1)
Makefile 使用总结 - wang_yb - 博客园
下面通过一个例子体会 override 的作用:
# Makefile内容 (没有用override) SRCS := programA.c programB.c programC.c all: @echo "SRCS: " $(SRCS) # bash中运行make $ make SRCS=nothing SRCS: nothing ################################################# # Makefile内容 (用override) override SRCS := programA.c programB.c programC.c all: @echo "SRCS: " $(SRCS) # bash中运行make $ make SRCS=nothing SRCS: programA.c programB.c programC.c
2.2.2 变量替换
# Makefile内容 SRCS := programA.c programB.c programC.c OBJS := $(SRCS:%.c=%.o) all: @echo "SRCS: " $(SRCS) @echo "OBJS: " $(OBJS) # bash中运行make $ make SRCS: programA.c programB.c programC.c OBJS: programA.o programB.o programC.o