Include
在Makefile使用include关键字可以把别的Makefile包含进来,这很像C语言的#include,被包含的文件会原模原样的放在当前文件的包含位置。include的语法是:
include<filename>filename可以是当前操作系统Shell的文件模式(可以保含路径和通配符)
在include前面可以有一些空字符,但是绝不能是[Tab]键开始。include和可以用一个或多个空格隔开。举个例子,你有这样几个Makefile:a.mk、b.mk、c.mk,还有一个文件叫foo.make,以及一个变量$(bar),其包含了e.mk和f.mk,那么,下面的语句:
include foo.make *.mk $(bar)
等价于:
include foo.make a.mk b.mk c.mk e.mk f.mk
-I 参数
1.如果make执行时,有“-I”或“--include-dir”参数,那么make就会在这个参数所指定的目录下去寻找。
2.如果目录/include(一般是:/usr/local/bin或/usr/include)存在的话,make也会去找。
GNU的make工作时的执行步骤入下:(想来其它的make也是类似)
1. 读入所有的Makefile。
2. 读入被include的其它Makefile。
3. 初始化文件中的变量。
4. 推导隐晦规则,并分析所有规则。
5. 为所有的目标文件创建依赖关系链。
6. 根据依赖关系,决定哪些目标要重新生成。
7. 执行生成命令。
一般我们可以使用“$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。复杂一些用法;可以使用
“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表。因此在一个目录下可以使用如下内容的Makefile来将工作目录下的所有的.c文件进行编译并最后连接成为一个可执行文件:
1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符
#sample Makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
通过VPATH来定义查找的路径。
在Linux操作系统中,有一个PATH环境变量。在make命令中,也有一个类似参数,叫做VPATH。这个变量就是用来指定make命令查找的路径。如果用户没有指定这个VPATH便量,则make命令只会在当前目录中去查找依赖文件和目标文件。但是如果用户定义了这个变量,则这个命令首先会在当前的目录中查找依赖文件和目标文件。如果在当前目录下找不到的话,则还会自动从VPATH变量定义的路径中去查找。
在这个变量中,可以定义多个路径,路径之间都是利用英文状态下的冒号进行分割
-
#include<stdio.h>
-
#include"l.h"
-
int main()
-
{
-
hello();
-
return 0;
-
}
*-*-*-*-*-*-*-*-*-*-*-*-* l.c 文件如下 *-*-*-*-*-*-*-*-*-*-*-*
-
#include<stdio.h>
-
#include"l.h"
-
void hello()
-
{
-
printf("I am form l.c file\n");
-
}
*-*-*-*-*-*-*-*-*-*-*-* l.h 文件如下 *-*-*-*-*-*-*-*-*-*-*-*-*-*
-
/*************************************************************
-
* Author : jonathan
-
* time : 2017,3,10 10:37
-
* effect : .h file
-
*************************************************************/
-
#ifndef _L_H_
-
#define _L_H_
-
void hello();
-
#endif
*-*-*-*-*-*-*-*-*-*-* Makefile 文件如下 *-*-*-*-*-*-*-*-*-*-*-*
-
#VPATH=include
-
vpath %.h include
-
o=l.o z.o
-
hello:$(o)
-
gcc -o $@ $(o)
-
z.o:z.c l.h
-
gcc -I include -c $<
-
l.o:l.c l.h
-
gcc -I include -c $<
-
.PHONY:clean
-
clean: