Makefile编写

mac2024-05-12  37

以下是我对Makefile编写一点见解,个人认为虽然过程较为复杂,但是其实实际操作起来如果找到了其中的奥妙还是相对来说比较简单。首先我先介绍一下make和Makefile. 下面这些是我是我用电鱼电子SAIL-AM335X实现的步骤。 make和Makefile的介绍

1.1 make工具

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

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

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

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

1.2 Makefile

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

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文件就写好了。

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 @ c l e a n : r m − f ∗ . o m a i n 我 们 定 义 了 一 个 变 量 叫 O B J , 他 是 我 们 的 依 赖 项 列 表 。 然 后 使 用 自 动 化 变 量 来 代 替 对 应 的 文 件 , 如 上 所 示 。 但 是 , 我 们 这 些 . c 文 件 都 要 生 成 . o 文 件 , 这 样 写 也 非 常 麻 烦 , 我 们 介 绍 另 一 些 规 则 。 模 式 规 则 后 缀 规 则 . c : . o 我 们 来 使 用 这 两 种 规 则 : . P H O N Y : c l e a n C C = g c c C F L A G S = − W a l l − g O B J = m a i n . o s u b . o a d d . o p r i n t . o m a i n : @ 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: @clean:rmf.omainOBJ使.c.o.c:.o使.PHONY:cleanCC=gccCFLAGS=WallgOBJ=main.osub.oadd.oprint.omain:(OBJ) $(CC) $(CFLAGS) $^ -o $@ #%.o:%.c .c.o: $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o main 使用这两个规则,就会将所有.c文件生成同名的.o文件,这样,Makefile就更加简洁。 4. make常用的内嵌函数 函数调用 $(function arguments) ( w i l d c a r d P A T T E R N ) 当 前 目 录 写 的 匹 配 模 式 的 文 件 例 如 : s r c = (wildcard PATTERN) 当前目录写的匹配模式的文件 例如:src= (wildcardPATTERN)src=(wildcard *.c) ( p a t s u b s t P A T T E R N , R E P L A C E M E N T , T E X T ) 模 式 替 换 函 数 例 如 : (patsubst PATTERN,REPLACEMENT,TEXT) 模式替换函数 例如: (patsubstPATTERN,REPLACEMENT,TEXT)(patsubst %.c, %.o, $src) 等价于 ( s r c : . c = . o ) s h e l l 函 数 执 行 s h e l l 命 令 例 如 : (src:.c=.o) shell函数 执行shell命令 例如: (src:.c=.o)shellshell(shell ls -d */) 以上就是我对Makefile编写的一些看法,希望大家能够采纳。

最新回复(0)