Makefile学习笔记(2)

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变量定义的路径中去查找。

在这个变量中,可以定义多个路径,路径之间都是利用英文状态下的冒号进行分割

  1. #include<stdio.h>

  2. #include"l.h"

  3. int main()

  4. {

  5. hello();

  6. return 0;

  7. }


*-*-*-*-*-*-*-*-*-*-*-*-* l.c 文件如下 *-*-*-*-*-*-*-*-*-*-*-*

 
  1. #include<stdio.h>

  2. #include"l.h"

  3. void hello()

  4. {

  5. printf("I am form l.c file\n");

  6. }

*-*-*-*-*-*-*-*-*-*-*-* l.h 文件如下 *-*-*-*-*-*-*-*-*-*-*-*-*-*

 
  1. /*************************************************************

  2. * Author : jonathan

  3. * time : 2017,3,10 10:37

  4. * effect : .h file

  5. *************************************************************/

  6. #ifndef _L_H_

  7. #define _L_H_

  8.  
  9. void hello();

  10.  
  11. #endif


*-*-*-*-*-*-*-*-*-*-* Makefile 文件如下 *-*-*-*-*-*-*-*-*-*-*-*

 
  1. #VPATH=include

  2. vpath %.h include

  3. o=l.o z.o

  4. hello:$(o)

  5. gcc -o $@ $(o)

  6. z.o:z.c l.h

  7. gcc -I include -c $<

  8. l.o:l.c l.h

  9. gcc -I include -c $<

  10. .PHONY:clean

  11. clean:

  12.  

猜你喜欢

转载自blog.csdn.net/weixin_42792614/article/details/82221082