Linux/Centos Makefile 使用总结 |
您所在的位置:网站首页 › makefile安装程序 › Linux/Centos Makefile 使用总结 |
1. Makefile 简介
Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂. Makefile的组织流程的能力如此之强, 不仅可以用来编译项目, 还可以用来组织我们平时的一些日常操作. 这个需要大家发挥自己的想象力.
本篇博客是基于 {精华} 跟我一起写 Makefile 而整理的, 有些删减, 追加了一些示例. 非常感谢 gunguymadman_cu 提供如此详尽的Makefile介绍, 这正是我一直寻找的Makefile中文文档. 1.1 Makefile 主要的 5个部分 (显示规则, 隐晦规则, 变量定义, 文件指示, 注释) Makefile基本格式如下: target ... : prerequisites ... command ... ...其中, target - 目标文件, 可以是 Object File, 也可以是可执行文件prerequisites - 生成 target 所需要的文件或者目标command - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)隐晦规则 :: make的自动推导功能所执行的规则变量定义 :: Makefile中定义的变量文件指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令注释 :: Makefile只有行注释 "#", 如果要使用或者输出"#"字符, 需要进行转义, "\#" 1.2 GNU make 的工作方式 读入主Makefile (主Makefile中可以引用其他Makefile)读入被include的其他Makefile初始化文件中的变量推导隐晦规则, 并分析所有规则为所有的目标文件创建依赖关系链根据依赖关系, 决定哪些目标要重新生成执行生成命令 2. Makefile 初级语法 2.1 Makefile 规则 2.1.1 规则语法 规则主要有2部分: 依赖关系 和 生成目标的方法. 语法有以下2种: target ... : prerequisites ... command ...或者 target ... : prerequisites ; command command ...*注* command太长, 可以用 "\" 作为换行符
2.1.2 规则中的通配符 * :: 表示任意一个或多个字符? :: 表示任意一个字符[...] :: ex. [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符, [0-9]表示 0~9中任意一个数字~ :: 表示用户的home目录
2.1.3 路径搜索 当一个Makefile中涉及到大量源文件时(这些源文件和Makefile极有可能不在同一个目录中), 这时, 最好将源文件的路径明确在Makefile中, 便于编译时查找. Makefile中有个特殊的变量 VPATH 就是完成这个功能的. 指定了 VPATH 之后, 如果当前目录中没有找到相应文件或依赖的文件, Makefile 回到 VPATH 指定的路径中再去查找.. VPATH 使用方法: vpath :: 当前目录中找不到文件时, 就从中搜索vpath :: 符合格式的文件, 就从中搜索vpath :: 清除符合格式的文件搜索路径vpath :: 清除所有已经设置好的文件路径
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) programC.o其中 = 和 := 的区别在于, := 只能使用前面定义好的变量, = 可以使用后面定义的变量 测试 =
测试 :=
2.2.2 变量替换
2.2.3 变量追加值 +=
2.2.4 变量覆盖 override 作用是使 Makefile中定义的变量能够覆盖 make 命令参数中指定的变量 语法: override = override := override +=
下面通过一个例子体会 override 的作用:
2.2.5 目标变量 作用是使变量的作用域仅限于这个目标(target), 而不像之前例子中定义的变量, 对整个Makefile都有效. 语法: :: :: override (override作用参见 变量覆盖的介绍)
示例: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |