关于Makefile最基础,最管用的资料
admin
2023-03-01 10:22:10
0

接下来让我们从以下几个方面来进行详细的了解吧

  1. make和Makefile的介绍

1.1 make工具

利用make工具可以自动完成编译工作。这些工作包括:

如果仅仅修改了某几个源文件,则只重新编译这几个源文件;

如果某个头文件被修改,则重新编译所有包含该头文件的源文件。

利用这种自动编译可大大简化开发工作,避免不必要的重新编译。

1.2 Makefile

make工具通过一个称为Makefile的文件来完成并自动维护编译工作。Makefile文件描述了整个工程的编译、链接等规则。

  1. Makefile基本规则

TARGET ...:DEPENDENCIES ...

COMMAND

...

目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如clean,也称伪目标。

依赖(DEPENDENCIES)是用来产生目标的输入文件列表,一个目标通常依赖于多个文件。

命令(COMMAND)是make执行的动作(命令是shell命令或者是可在shell下执行的程序)。注意:每个命令行的起始字符必须为TAB字符。

如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容。

接下来就根据这个Makefile基本规则来编写一个最基本的Makefile文件

.PHONY:clean

main:main.o sub.o add.o print.o

gcc -Wall -g main.o add.o sub.o print.o -o main

main.o:main.c

gcc -Wall -g -c main.c -o main.o

add.o:add.c add.h

gcc -Wall -g -c add.c -o add.o

sub.o:sub.c sub.h

gcc -Wall -g -c sub.c -o sub.o

print.o:print.c print.h

gcc -Wall -g -c print.c -o print.o

clean:

rm -f *.o main

我们可以看到,main是我们最终想要生成的目标文件,它依赖main.o sub.o add.o print.o这四个.o文件。因此要执行gcc -Wall -g main.o add.o sub.o print.o -o main命令来生成目标文件,但是当前没有这些.o文件,因此就要先生成这些.o文件。我们写了四条.o:.c然后执行gcc -Wall -g -c .c -o .o,这些语句就会生成目标文件的依赖项。

clean是一个伪目标文件,因为它没有依赖项。我们只是想通过make clean来将.o文件删除,但是我们通常要指定.PHONY:clean这条语句,用来显式的指定clean是伪目标,来防止当前目录下有一个同名的clean文件。这样,一个简单呢的Makefile文件就写好了。

  1. Makefile自动化变量

虽然像上述那样可以完成编译,但是明显非常麻烦,接下来介绍Makefile的自动化变量。

选项名 作用

$@ 规则的目标文件名

$< 规则的第一个依赖文件名

$^ 规则的所有依赖文件列表

我们使用这些自动化变量来尝试从写刚才的Makefile

.PHONY:clean

OBJ=main.o sub.o add.o print.o

main:$(OBJ)

gcc -Wall -g $^ -o $@

main.o:main.c

gcc -Wall -g -c $< -o $@

add.o:add.c add.h

gcc -Wall -g -c $< -o $@

sub.o:sub.c sub.h

gcc -Wall -g -c $< -o $@

print.o:print.c print.h

gcc -Wall -g -c $< -o $@

clean:

rm -f *.o main

我们定义了一个变量叫OBJ,他是我们的依赖项列表。然后使用自动化变量来代替对应的文件,如上所示。

但是,我们这些.c文件都要生成.o文件,这样写也非常麻烦,我们介绍另一些规则。

模式规则

%.o:%.c

后缀规则

.c:.o

我们来使用这两种规则:

.PHONY:clean

CC = gcc

CFLAGS = -Wall -g

OBJ = main.o sub.o add.o print.o

main:$(OBJ)

$(CC) $(CFLAGS) $^ -o $@

#%.o:%.c

.c.o:

$(CC) $(CFLAGS) -c $< -o $@

clean:

rm -f *.o main

使用这两个规则,就会将所有.c文件生成同名的.o文件,这样,Makefile就更加简洁。

  1. make常用的内嵌函数

函数调用

$(function arguments)

$(wildcard PATTERN)

当前目录写的匹配模式的文件

例如:src=$(wildcard *.c)

$(patsubst PATTERN,REPLACEMENT,TEXT)

模式替换函数

例如:$(patsubst %.c, %.o, \$src)

等价于$(src:.c=.o)

shell函数

执行shell命令

例如:$(shell ls -d */)
我是在基于sail-imx6q开发板的linux上实现上述步骤的,感兴趣的小伙伴也可以继续研究一下。
www.dianyu.net

相关内容

热门资讯

全球单机容量最大!16兆瓦漂浮... 全球单机容量最大的16兆瓦漂浮式海上风电平台“三峡领航号”,近日在广东阳江海域完成海上固定安装,标志...
坚朗五金获得实用新型专利授权:... 证券之星消息,根据天眼查APP数据显示坚朗五金(002791)新获得一项实用新型专利授权,专利名为“...
揭秘展会大屏:看MES数据联动... 在各大工业展会现场,最吸引眼球的往往是那些流光溢彩、数据飞驰的“数字孪生”大屏。它们实时映射着远方工...
原创 发... 汽车界关于全固态电池的喧嚣似乎已然平息。曾几何时,2024年与2025年的车企新品发布会上,2026...
AI“算力税”该不该征? 近日,对AI算力征税引发讨论。支持者认为,AI税既可以帮助政府获得新的财政收入,也可以通过提高AI使...
韩国宣布延长囤积石油禁令至7月 新华社北京5月8日电 韩国政府7日宣布,将禁止囤积和垄断石油产品的措施延长两个月至7月底,以应对中东...
外媒:涉汉坦病毒疫情邮轮乘客曝... 【环球网报道】据美国全国广播公司(NBC)当地时间5月7日报道,涉汉坦病毒疫情的“洪迪厄斯”号邮轮上...
驴友在川西4600米营地帐篷里...   驴友在川西4600米营地帐篷里去世  【驴友在川西4600米营地帐篷里去世】近日,多名驴友发视频...
“顾客用餐盘喂狗”引争议,多家... 近日,多起顾客在饭店用餐盘、铁签喂狗的视频,引发争议。据荔枝新闻5月6日报道,一网友发视频称,在广东...
谢晓亮追忆科学狂人文特尔:一位... 来源:市场资讯 (来源:知识分子) 克雷格·文特尔(Craig Venter) 撰文|谢晓亮 20...