makefile的基本用法

简单Makefile实例
本文介绍两种简单的Makefile配置方法,一种仅包含一行代码用于生成目标文件,另一种则通过定义变量来增强灵活性。这两种方法适用于快速编译Linux内核模块。
makefile可以写得很复杂,也可以很简单
 
1. 最简单的,只需要一句:
[root@localhost hello]# cat Makefile
 
obj-m := hello.o  
 
编译时执行:make -C /usr/src/linux-2.6.15.5 M=$(pwd) modules
 
2. 也可以稍微复杂点:
[root@localhost hello]# cat Makefile

KERNELDIR ?= /lib/modules/2.6.18-92.el5xen/build/  //链接库目录
PWD := $(shell pwd)        //当前目录                     
obj-m := hello.o           //target,生成hello.ko
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
// 执行的语句

<think>我们正在讨论Makefile基本使用方法和模式规则写法。结合用户提供的引用和之前的回答,我们可以这样组织内容: 1. 基本结构:Makefile由规则组成,每条规则包括目标(target)、依赖(prerequisites)和命令(recipe)。 2. 变量:使用变量提高可维护性(引用[1]提到变量是高级用法的一部分,但这里我们介绍基本变量)。 3. 模式规则:使用通配符%来定义通用规则,避免为每个文件重复写规则(引用[3]中的例子展示了重写单个文件foo.c的Makefile,我们可以扩展为模式规则)。 4. 条件语句:引用[2]展示了if语句的使用,我们可以在基本用法中简单提及。 根据用户要求,我们将重点放在基本使用和模式规则上。 以下为回答结构: ### 一、Makefile基本结构 1. 规则语法: ```makefile 目标: 依赖 命令 # 注意:命令前必须是Tab,不能是空格 ``` 2. 示例:编译单个C文件 ```makefile # 基本编译示例 hello: hello.c gcc hello.c -o hello ``` 3. 常用变量: ```makefile CC = gcc # 定义编译器 CFLAGS = -Wall -O2 # 编译选项 TARGET = hello # 目标文件 $(TARGET): hello.c $(CC) $(CFLAGS) hello.c -o $(TARGET) ``` ### 二、模式规则(Pattern Rules) 模式规则使用`%`通配符匹配文件名,实现通用规则: ```makefile # 将任意.c文件编译为同名.o文件 %.o: %.c $(CC) -c $< -o $@ # 说明: # % : 匹配任意非空字符串(如 hello 匹配 hello.c 和 hello.o) # $< : 表示第一个依赖(这里为%.c对应的具体文件名) # $@ : 表示目标文件名(这里为%.o对应的具体文件名) ``` ### 三、多文件项目的模式规则应用 假设项目有多个.c文件,最终链接成一个可执行文件: ```makefile # 定义变量 CC = gcc CFLAGS = -Wall TARGET = program SRCS = main.c utils.c # 源文件列表 OBJS = $(SRCS:.c=.o) # 将SRCS中的.c替换为.o(得到main.o utils.o) # 最终目标:链接所有.o文件 $(TARGET): $(OBJS) $(CC) $^ -o $@ # $^ 表示所有依赖文件 # 模式规则:编译每个.c到.o(无需为每个.c重复写规则) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理目标 clean: rm -f $(OBJS) $(TARGET) ``` ### 四、条件语句(简单示例) 引用[2]中展示了if语句,我们可以用于条件判断: ```makefile # 检查是否定义DEBUG变量,若定义则添加调试选项 ifdef DEBUG CFLAGS += -g endif ``` 使用:`make DEBUG=1` 会启用调试选项。 ### 五、自动变量总结 | 变量 | 含义 | |------|-----------------------| | `$@` | 当前目标文件名 | | `$<` | 第一个依赖文件名 | | `$^` | 所有依赖文件列表 | | `$?` | 比目标新的依赖文件列表 | | `$*` | 匹配通配符%的部分 | ### 六、运行Makefile - 默认执行第一个目标:`make` - 指定目标:`make clean` - 定义变量:`make CFLAGS="-O0"` ### 七、最佳实践建议 1. 使用模式规则减少重复代码 2. 分离编译和链接阶段(先编译成.o再链接) 3. 声明伪目标避免与文件名冲突(引用[3]中提到伪目标): ```makefile .PHONY: clean ``` ### 八、示例:完整Makefile ```makefile CC = gcc CFLAGS = -Wall TARGET = app SRCS = main.c util.c OBJS = $(SRCS:.c=.o) .PHONY: all clean all: $(TARGET) $(TARGET): $(OBJS) $(CC) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(OBJS) $(TARGET) ``` > 注意:模式规则`%.o: %.c`告诉make如何从.c文件生成.o文件,当make发现需要构建一个.o文件时,就会应用这条规则[^3]。 §§相关问题§§ 1. Makefile中如何管理头文件依赖? 2. 如何编写跨平台的Makefile? 3. Makefile中如何实现并行编译?</think>### Makefile 基本用法与模式规则详解 #### 一、Makefile 基础结构 Makefile 的核心是**规则**,由目标、依赖和命令组成: ```makefile 目标: 依赖 命令 # 必须用 Tab 开头 ``` 示例:编译单个 C 文件 ```makefile # 基础变量定义 CC = gcc CFLAGS = -Wall -O2 # 简单规则 hello: hello.c $(CC) $(CFLAGS) hello.c -o hello ``` > 执行 `make hello` 将编译程序[^3] #### 二、模式规则核心语法 模式规则使用 `%` 通配符实现通用匹配: ```makefile %.o: %.c $(CC) -c $< -o $@ ``` - `%`:匹配任意非空字符串(如 `main` 匹配 `main.c` 和 `main.o`) - `$<`:表示第一个依赖文件 - `$@`:表示目标文件名 #### 三、多文件项目示例 ```makefile # 定义变量 TARGET = app SRCS = main.c utils.c OBJS = $(SRCS:.c=.o) # 将.c替换为.o # 最终目标规则 $(TARGET): $(OBJS) $(CC) $^ -o $@ # $^ 表示所有依赖文件 # 模式规则:编译所有.c文件 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理规则 clean: rm -f $(OBJS) $(TARGET) .PHONY: clean # 声明伪目标[^3] ``` > 执行流程: > 1. `make` → 查找第一个目标 `$(TARGET)` > 2. 发现依赖 `main.o utils.o` > 3. 通过模式规则编译 `.c` → `.o` > 4. 链接所有 `.o` 生成可执行文件 #### 四、模式规则进阶技巧 1. **多级目录处理** ```makefile OBJDIR = obj SRCDIR = src # 带目录的模式规则 $(OBJDIR)/%.o: $(SRCDIR)/%.c @mkdir -p $(@D) # 创建目标目录 $(CC) -c $< -o $@ ``` 2. **条件语句应用**(引用[2]) ```makefile # 根据环境变量切换目录 BUILD_DIR := $(if $(BUILD),$(BUILD),build) release: $(MAKE) BUILD=release ``` 3. **静态模式规则** ```makefile # 只对特定文件应用规则 $(OBJS): %.o: %.c $(CC) -c $< -o $@ ``` #### 五、自动变量速查表 | 变量 | 含义 | 示例 | |------|--------------------|-----------------------| | `$@` | 当前目标文件名 | `main.o` | | `$<` | 第一个依赖文件名 | `main.c` | | `$^` | 所有依赖文件列表 | `main.c utils.c` | | `$?` | 更新的依赖文件列表 | 修改过的 `.c` 文件 | | `$*` | 匹配 `%` 的部分 | `main` (针对 `%.c`) | #### 六、执行控制 ```bash # 基本编译 make # 指定目标 make clean # 并行编译(加速构建) make -j4 # 覆盖变量 make CFLAGS="-O0 -g" ``` > **最佳实践**: > 1. 始终声明 `.PHONY` 目标(如 `clean`) > 2. 使用 `@` 前缀隐藏命令回显(如 `@echo "Compiling..."`) > 3. 通过 `-include` 自动引入依赖关系(进阶用法)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值