Command--makefile

51 篇文章 6 订阅
31 篇文章 1 订阅

参考链接

一、Makefile简介

脚本用途:	把一系列命令的集合放在文件中批量执行。
Makefile可以理解为一个特殊的脚本文件;它的作用就是项目管理。

二、Makefile语法

  1. 书写语法
Makefile命名规则:
	1)	Makefile
	2)	makefile

Makefile内容语法:
	ALL:   #指定makefile的终极目标
	clean -n: -rm -rf file1 # ,实际并不执行。 不加-n参数会直接执行clean后的命令。
	#-n 参数列出要执行的命令
	#-rm前的-的作用:删除不存在文件时,不报错。顺序执行结束。

1.一个规则
	目标:依赖条件      
		(一个tab缩进)命令  #前面必须是一个tab缩进
	#①目标时间必须晚于依赖条件的时间,否则更新目录
	#②依赖条件如果不存在,找寻新的规则去产生依赖。如下例
	#例:hello:hello.o
	#		gcc  hello.o -o hello
	#   hello.o:hello.c
	#   	gcc -c hello.c -o hello.o
	注意:每个目标都可以像ALL(make)一样单独执行,语法:make 目标
2.两个函数
	$(wildcard *.c) #匹配当前工作目录下的所有.c文件(例a.c b.c c.c d.c),将文件名组成列表,赋值给变量src。  等价于 $(wildcard ./*.c)
	#src = $(wildcard *.c)  #将函数结果赋值给变量src
	#指定文件夹: $(wildcard ./src/*.c)
	
	$(patsubst %.c, %.o ,$(src)) #将参数3中,包含参数1的部分,替换为参数2.(例:obj=a.o sub.o c.o d.o)
	#指定文件夹: $(patsubst ./src%.c, ./obj/%.o ,$(src))
	
3.三个自动变量
	$@: 在规则的命令中,表示规则中的目标。
	$^:在规则的命令中,表示所有依赖条件
	$<:在规则的命令中,表示第一个依赖条件。 如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则。
	
4.模式规则:
	%.o:%.c
		gcc -c $< -o $@
	扩展:
		静态模式规则(就是指定这个模式规则给谁用):
			$(obj):%.o:%.c
				gcc -c $< -o $@			

5.伪目标:
	.PHONY:clean ALL #一般加在makefile的最下面,
	#目的是为了防止文件中出现同名为 clean 和ALL时,执行make clean 或make命令时出现报错问题。

6.使用变量
	myArgs=-Wall -g  #用法详看下面示例
	引用:
		gcc -c $< -o $@	 $(myArgs)
7.参数
-n #查看要执行的命令,实际并不执行
-f #指定文件执行 make命令,有些文件为.mk就是nakefile文件

最终和最初makefile文件示例:
在这里插入图片描述

  1. 执行语法
make -n #查看要执行的命令,实际并不执行
make -f makefile文件名 #执行指定的makefile文件名 
make 目标名 #执行指定的makefile命令

三、究极版makefile(脚本语言编法)

cc = gcc
prom = calc
deps = $(shell find ./ -name "*.h")
src = $(shell find ./ -name "*.c")
obj = $(src:%.c=%.o) 

$(prom): $(obj)
    $(cc) -o $(prom) $(obj)

%.o: %.c $(deps)
    $(cc) -c $< -o $@

clean:
    rm -rf $(obj) $(prom)

解释:
首先是%.o:%.c,这是一个模式规则,表示所有的.o目标都依赖于与它同名的.c文件(当然还有deps中列出的头文件)。再来就是命令部分的@,其中^),具体到我们这里就是%.c。而$@代表的是当前语句的目标,即%.o。这样一来,make命令就会自动将所有的.c源文件编译成同名的.o文件。不用我们一项一项去指定了。整个代码自然简洁了许多。

shell函数主要用于执行shell命令,具体到这里就是找出当前目录下所有的.c和.h文件。而$(src:%.c=%.o)则是一个字符替换函数,它会将src所有的.c字串替换成.o,实际上就等于列出了所有.c文件要编译的结果。有了这两个设定,无论我们今后在该工程加入多少.c和.h文件,Makefile都能自动将其纳入到工程中来。

四、使用make可能会报错

1. 报下面两种错误

  • makefile:8: *** missing separator (did you mean TAB instead of 8
    spaces?). Stop.
  • makefile:2: *** missing separator. Stop.

解决办法:
首先一定要用vim去编写这些命令,当行前是tab键时,该行会显示紫色;如果vim编辑不能键入tab那就参考下面方法。

将下面的四行填加到/etc/vim/vimrc文件中

set tabstop=4  #一个tab键所占的列数
set sw=4  #自动缩进的时候,缩进尺寸为4个空格
set noexpandtab  #输入tab时不会自动将其转化为空格
set autoindent  #回车后自动缩放

在这里插入图片描述

  1. 输入make命令时误输入了make'
    在这里插入图片描述
    出去办法,再输入一个'然后敲回车即可。
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值