make和Makefile总结一

博客介绍了make的作用,通过目标和依赖关系关联,运行一次make命令可创建软件项目所有目标。还阐述了makefile基本编写规则,需掌握目标、依赖关系和命令三个概念,介绍了目标格式及不同make命令的执行方式。

该系列将会一步一步的从最基本的Makefile文件编写讲到复杂项目的Makefile编写


一:make的介绍

对于一个真实的软件项目,为了通过make生成最终的目标,需要产生大量的中间目标,
而各规则所描述的依赖关系就是将所有的目标关联在一起,结果就是使得我们可以只运行一次 make命令,
而链式反应地创建整个软件项目的所有目标-编译每一个源文件生成目标文件、生成库,以及创建可执行文件。
是否真正驾驭Makefile的标志,就看能否运用目标和依赖关系去思考和表达需要make为我们所做的事情。


二:makefile的基本编写规则

学习makefile,首先要掌握3个概念,目标(target),依赖关系(dependency)和命令(command)。
目标:是指make以后要生成什么
依赖:是指目标所依赖的起来目标(可以不要)
命令:是告诉make如何生成目标
格式:

目标:依赖
	命令
main:main.c
	gcc main.c -o main

目标不仅仅只能是想要生成的文件,也可以是想要执行的命令
将Makefile文件改成以下样子:

main:main.c
	gcc main.c -o main
clean:
	rm main

我们使用make命令的时候,make只会进入Makefile中寻找第一个目标,也就是main,当生成了main后就退出了
我们想要make去执行rm main,就需要使用make clean命令,make就会去寻找clean这个目标并执行了

注意:1.make会通过判断目标文件是否存在 或者 对比依赖文件的时间戳来判断依赖文件是否改变 来决定是否执行命令,
       当我们make成main文件后,不改变main.c再次使用make命令,就会出现make: `main' is up to date.
	    只有删除main 或者 更新依赖文件main.c才能再次make
			  
     2.make会把clean也当作一个目标文件,因为Makefile的目录中没有clean文件,然后也没有依赖文件,所以可以重复执行make clean命令
       如果目录中存在clean文件时,我们再次使用make clean命令就会提示make: `clean' is up to date. 这样就和我们所想的流程就对不上了
	   这时候我们就需要使用到假目标了,假目标的关键字是.PHONY(必须是大写),假目标会告诉make,
	   我后面跟的目标都不要当作文件来对他们进行判断需不需要执行命令,反正每次都执行命令就对了
       将Makefile文件改成以下样子:
main:main.c
   gcc main.c -o main
   				  
.PHONY:clean
clean:
   rm main
    .PHONY后面可以跟多个目标,用空格隔开就行了,目标后面也是可以跟多个依赖,也是用空格隔开就好了
    3.make执行的时候会把命令内容都打印一边,如果想要不打印,只需要在命令前加上@即可

  • 这样一个最基本的Makefile文件就写好了
<think>好的,用户让我介绍makeMakefile的用法。首先,我需要考虑用户的使用场景。可能他们是在学习C/C++项目构建,或者在处理需要编译多个源文件的项目。用户可能已经接触过手动编译,但遇到效率题,或者想自动化构建流程。 接下来,用户身份可能是个刚开始学习编程的学生,或者刚接触Linux开发的开发者。他们对构建工具不太熟悉,需要基础而清晰的指导。用户的需求不仅仅是知道命令,而是理解Makefile的结构如何自定义规则。 用户的题可能隐含了些深层需求,比如如何管理复杂的项目依赖,如何优化编译时间,或者如何整合其他工具到构建流程中。因此,在回答时不仅要解释基本用法,还要提到进阶技巧,比如变量使用、模式规则,以及如何避免常见错误。 需要确保回答结构清晰,分步骤说明,并给出示例,这样用户能跟着操作。同时,要强调Makefile的语法规则,比如缩进必须用Tab,这是新手常犯的错误。另外,提供验证方法常见题解决能帮助用户自查配置是否正确。 可能用户在使用make时遇到题,比如目标不更新或者变量未正确展开,所以需要解释PHONY目标变量赋值的方式。此外,自动变量如$@$^的使用能简化规则,这些实用技巧能提升他们的效率。 最后,总结部分要强调make的优势,比如自动化构建依赖管理,确保用户明白为什么使用make而不是手动编译。可能用户还不太清楚Makefile与其他构建工具的区别,但暂时不需要深入,保持回答聚焦在makeMakefile的基本用法即可。</think>以下是对 `make` 工具 `Makefile` 用法的详细介绍: --- ### 、核心概念 **make**:自动化构建工具,通过读取 `Makefile` 文件执行预定义任务 **Makefile**:包含构建规则依赖关系的文本文件(文件名必须首字母大写) --- ### 二、基本语法结构 ```makefile 目标(target): 依赖项(dependencies) [TAB]命令(command) ``` 示例: ```makefile app: main.o utils.o gcc main.o utils.o -o app main.o: main.c gcc -c main.c utils.o: utils.c gcc -c utils.c clean: rm -f *.o app ``` --- ### 三、核心用法 #### 1. 基本命令 ```bash make # 默认执行第个目标 make target # 执行指定目标(如 make clean) make -n # 模拟执行(显示将执行的命令但不真正执行) make -j4 # 使用4个线程并行编译 ``` #### 2. 变量定义 ```makefile CC = gcc CFLAGS = -Wall -O2 OBJS = main.o utils.o app: $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o app ``` #### 3. 自动变量 ```makefile $@ # 当前目标名 $< # 第个依赖项 $^ # 所有依赖项 $? # 更新的依赖项 ``` --- ### 四、进阶技巧 1. **模式规则**(适用于批量处理) ```makefile %.o: %.c $(CC) -c $< -o $@ ``` 2. **伪目标**(声明不生成文件的目标) ```makefile .PHONY: clean clean: rm -f *.o app ``` 3. **条件判断** ```makefile DEBUG = 1 ifeq ($(DEBUG),1) CFLAGS += -g endif ``` 4. **函数调用** ```makefile SRCS = $(wildcard *.c) # 获取所有.c文件 OBJS = $(SRCS:.c=.o) # 转换文件后缀 ``` --- ### 五、验证与调试 1. 查看详细执行过程: ```bash make --debug ``` 2. 显示变量值: ```bash make -p | grep CFLAGS ``` 3. 图形化显示依赖关系: ```bash make -Bnd | make2graph | dot -Tpng -o deps.png ``` --- ### 六、最佳实践建议 1. **文件组织**: ``` project/ ├── Makefile ├── include/ │ └── utils.h └── src/ ├── main.c └── utils.c ``` 2. **通用Makefile模板**: ```makefile CC = gcc CFLAGS = -Wall -I./include SRC_DIR = src OBJ_DIR = obj SRCS = $(wildcard $(SRC_DIR)/*.c) OBJS = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS)) app: $(OBJS) $(CC) $^ -o $@ $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ $(OBJ_DIR): mkdir -p $@ clean: rm -rf $(OBJ_DIR) app ``` --- ### 七、常见错误处理 1. **缺失Tab缩进**: ``` Makefile:2: *** missing separator. Stop. ``` ➔ 确保命令前使用Tab而不是空格 2. **循环依赖**: ``` make: Circular dependency dropped. ``` ➔ 检查目标之间的依赖关系链 3. **文件未更新**: ➔ 使用 `touch filename` 强制更新文件时间戳 --- ### 八、总结优势 1. 自动化处理文件依赖关系 2. 增量编译(仅重新编译修改过的文件) 3. 支持多平台(Linux/macOS/Windows均可使用) 4. 可集成其他工具(代码生成、测试等)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值