[linux]makefile多目录 自定义变量 自动变量 自动匹配 makefile函数 代码实现
在使用makefile多目录编写前需要掌握几个函数及符号
target=edit
引用的时候直接使用 $(target)
有点像C语言中的#define
,这里的 $(target)
会被替换成edit
.
也可以替换多个文件,注意空格
object=main.o xxx.o xxx.o
自动变量
自动变量是使用在第二行也就是gcc -c xxx
中
$<
: 规则中的第一个依赖$@
:规则中的目标$^
: 规则中所有的依赖
$(target):$(obj)
gcc $^ -o $@
这行代码的意思是规则中所有的依赖($^)(.o文件)生成目标($@)
$(target)
自动匹配
子规则中:目标:依赖
%.o:%.c
自动匹配终极目标的依赖 :
main.o:main.c
add.o:add.c
sub.o:sub.c
makefile函数
pro=$(wildcard src/*.c)
src=$(wildcard *.c)
obj=$(patsubst %.c,%.o,$(pro) $(src))
wildcard
查找当前目录下和src目录下所有.c文件,分别返回给pro和srcpro=$(wildcard *.c)
src=$(wildcard src/*.c)
patsubst
替换所有.c文件为.o文件obj=$(patsubst %.c,%.o,$(pro) $(src))
注意:
我在这里用空格将$(pro) $(src)
分隔开,这样在编译的时候系统不会发生main.cxxx.c
的情况,也就是头尾相连.
如此,前期准备工作就完成了.
代码实现
.
├── main.c
├── makefile
└── src
├── Speak.c
└── Speak.h
main.c
#include <stdio.h>
#include "src/Speak.h"
int main()
{
printf("Helo
");
Speak();
return 0;
}
src/Speak.c
#include "Speak.h"
void Speak(void)
{
printf("Speak
");
}
src/Speak.h
#include <stdio.h>
void Speak(void);
在这里开始解释makefile文件
pro=$(wildcard *.c)
src=$(wildcard src/*.c)
obj=$(patsubst %.c,%.o,$(pro) $(src))
target=edit
$(target):$(obj)
gcc $^ -o $@
%.o:%.c
gcc -c $< -o $@
.PHONY:clean
clean:
rm $(obj) $(target) -f
我们将根目录下的.c文件(只有一个main.c)通过wildcard
返回给pro
src
目录下的.c文件通过wildcard
返回给src
通过patsubst
替换所有.c文件为.o文件
然后通过自动匹配依赖
%.o:%.c
gcc -c $< -o $@
生成各个.c文件的.o文件
最终生成edit可执行文件
$(target):$(obj)
gcc $^ -o $@
整理:
-
利用
wildcard
返回各个目录下的.c文件, -
利用
patsubst
将各个.c换成.o(这一步并没有生成.o文件,只是相当于将main.c
返回为main.o
) -
利用自动匹配自动生成各个.o(这一步才是生成.o文件)
-
将所有的.o生成可执行文件edit