### make命令及makefile文件详解 #### 一、make与makefile简介 在Linux系统中,`make`命令被广泛用于构建项目。它基于一个文本文件(通常称为`makefile`)来自动化编译和链接过程。makefile 文件定义了如何生成目标文件以及构建过程中的依赖关系。 #### 二、make命令基础 `make`命令的核心在于执行makefile文件中定义的目标(target)。每个目标可以依赖于其他目标或文件,并指定如何生成这些目标的具体命令。make会根据文件的时间戳来决定哪些目标需要重新构建。 #### 三、makefile文件结构 makefile文件由一系列规则组成,包括目标、依赖项和命令。其基本格式如下: ```makefile target : dependencies command ``` - **target**:要构建的目标文件。 - **dependencies**:构建目标所需的依赖文件。 - **command**:执行的命令,用于生成目标文件。 #### 四、makefile示例解析 下面通过具体的例子来深入了解makefile的用法: 1. **简单示例** ```makefile target1: obj1 obj2 gcc -o $@ obj1 obj2 ``` 这个简单的规则定义了一个名为`target1`的目标,该目标依赖于`obj1`和`obj2`两个对象文件。当执行`make target1`时,`gcc`命令将被调用来生成`target1`。 2. **多目标示例** ```makefile target2: ls ``` 这个规则定义了一个名为`target2`的目标,没有依赖项。执行`make target2`时,会列出当前目录下的所有文件。 3. **复杂的makefile示例** ```makefile CFLAGS = -Wall OBJ = xx.o yy.o all: zz $(MAKE) ok zz ok: ./zz zz: $(OBJ) gcc $(OBJ) -o $@ xx.o: x.h x.c gcc $(CFLAGS) -c x.c -o xx.o yy.o: y.h y.c gcc $(CFLAGS) -c y.c -o yy.o ``` 在这个示例中,定义了多个规则: - `CFLAGS`变量设置了编译器的默认选项。 - `OBJ`变量列出了所有需要的对象文件。 - `all`目标依赖于`zz`,并通过`$(MAKE) ok zz`命令执行。 - `ok`目标用于运行`zz`程序。 - `zz`目标依赖于`xx.o`和`yy.o`,并最终生成`zz`可执行文件。 - `xx.o`和`yy.o`目标分别定义了如何从源代码文件生成对象文件。 #### 五、make命令的高级用法 除了基本的用法之外,`make`还支持许多高级功能,例如变量和函数的使用: - **变量赋值** ```makefile CFLAGS = -Wall ``` 这里定义了一个变量`CFLAGS`,用于存储编译器选项。 - **函数使用** ```makefile $(patsubst %.c,%.o,$(wildcard *.c)) ``` 这行代码使用了`patsubst`和`wildcard`函数,用于自动获取所有`.c`文件并转换为对应的`.o`文件。 #### 六、总结 通过本篇文章的学习,我们不仅了解了`make`命令的基本用法,还深入探讨了`makefile`文件的编写技巧。无论是简单的单文件项目还是复杂的多模块项目,都可以通过合理地设计`makefile`来实现自动化构建。这不仅提高了开发效率,也确保了项目的可靠性和可维护性。对于Linux开发者而言,熟练掌握`make`命令和`makefile`文件的编写是非常重要的技能之一。
























make AND makefile
编 者:张永辉 2009年12月14日
参考书籍:linuxVbird-2[447 - 475] 嵌入式Linux应用程序开发[86 - 92]
make的好处:
简化编译时时所要下达的命令
编译完成后,又改变了某个源代码,make只会编译改变了的档案,不会改变其他ObjectFile,最后根据相依性更新执行文档。
make格式:[文件名必须是 makefile 内容如下]
target1 :[obj1] [obj2] [...] [target1:想要建立的资讯 obj1 obj1 ... :目标档案]
<Tab> gcc -o obj1 obj2 [此行开头必须要一个Tab键,后面是要执行的命令 ]
target2 : #注解 [#代表注解 ]
<Tab> ls
使用方法:[在命令窗口输入]
make target1 [将执行target1下的命令,可能会执行target2下的命令 ]
make target2 [将会列表当前文件列表,即执行target2下的ls命令 ]
make [将执行从makefile开头执行,按时间截执行命令 ]
make target2 target1 [先执行target2,后执行target1 ]
实验:
[有文件 me1.c me1.h]
[makefile内容如下: ]
[ me : me1.c me1.h ][格式=目标体:目标体所依赖的文件 ]
[ gcc me1.c me2.c -o me ][ <Tab> 目标体运行时需要的命令 ]
make me [会执行makefile中的第二行命令]
./me [执行档案 ]
[#makefile] [make基本流程][ 按时间截自动执行命令 ][此默认有x.h x.c y.h y.c 4个源文件 ]


- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于MATLAB GUI的学生成绩管理应用系统
- 基于机器学习与深度学习的中文微博情感解析研究
- Android RecyclerView 实现电视同款水平无限自动滚动轮播
- springboot-船运物流管理系统.zip
- springboot-高校竞赛管理系统.zip
- springboot-基于大数据的智能家居销量数据分析.zip
- Android RecyclerView 实现卡片滑动层叠效果
- 吴恩达微专业之深度学习工程师作业
- C语言手撕机器学习/深度学习算法
- 《超简单教程:一键云编译OpenWrt-Lede固件轻松上手》
- 笔记本电脑广州托运北京
- 通用深度学习推理工具,可在生产环境中快速上线由TensorFlow、PyTorch、Caffe框架训练出的深度学习模型
- 笔记本电脑广州托运北京小程序
- 神策数据官方 Java 埋点 SDK:轻量级 Java 端数据采集工具
- 基于STM32单片机的低功耗授时单元设计.caj
- 基于Linux操作系统动态调频技术研究.pdf


