Makefile教程

Makefile 其他功能

在本章中,我们将研究 Makefile 的各种其他功能。

Make 的递归使用

递归使用 make 意味着使用 make 作为 makefile 中的命令。当您需要为组成更大系统的各种子系统提供单独的 makefile 时,此技术很有用。例如,假设您有一个名为"subdir"的子目录,它有自己的 makefile,并且您希望包含目录的 makefile 在子目录上运行 make。您可以通过编写以下代码来实现-
subsystem:
   cd subdir && $(MAKE)
or, equivalently:
 	
subsystem:
   $(MAKE)-C subdir
您只需复制此示例即可编写递归 make 命令。但是,您需要了解它们的工作原理和原因,以及子品牌与顶级品牌之间的关系。

将变量传达给子制作

顶级 make的变量值可以通过环境通过显式请求传递给子make。这些变量在 sub-make 中定义为默认值。除非您使用 `-e' 开关,否则您无法覆盖子 make 生成文件使用的生成文件中指定的内容。
要传递或导出变量, make 将变量及其值添加到运行每个命令的环境中。反过来,子 make 使用环境来初始化其变量值表。
特殊变量 SHELL 和 MAKEFLAGS 始终会导出(除非您取消导出它们)。如果您将其设置为任何内容,则会导出 MAKEFILES。
如果要将特定变量导出到子制作,请使用导出指令,如下所示-
export variable ...
如果你想阻止一个变量被导出,使用 unexport 指令,如下所示-
unexport variable ...

变量 MAKEFILES

如果定义了环境变量 MAKEFILES, make 会将其值视为要在其他 makefile 之前读取的其他 makefile 的名称列表(由空格分隔)。这很像 include 指令:在各种目录中搜索这些文件。
MAKEFILES 的主要用途是在 make 的递归调用之间进行通信。

包含来自不同目录的头文件

如果你把头文件放在不同的目录下,并且你在不同的目录下运行 make,那么需要提供头文件的路径。这可以使用 makefile 中的-I 选项来完成。假设functions.h文件在/home/lidihuo/header文件夹中可用,其余文件在/home/lidihuo/src/文件夹中可用,那么makefile将如下编写-
INCLUDES =-I "/home/lidihuo/header"
CC = gcc
LIBS = -lm
CFLAGS =-g-Wall
OBJ =  main.o factorial.o hello.o
hello: ${OBJ}
   ${CC} ${CFLAGS} ${INCLUDES}-o $@ ${OBJS} ${LIBS}
.cpp.o:
   ${CC} ${CFLAGS} ${INCLUDES}-c 
INCLUDES =-I "/home/lidihuo/header"
CC = gcc
LIBS = -lm
CFLAGS =-g-Wall
OBJ =  main.o factorial.o hello.o

hello: ${OBJ}
   ${CC} ${CFLAGS} ${INCLUDES}-o $@ ${OBJS} ${LIBS}
.cpp.o:
   ${CC} ${CFLAGS} ${INCLUDES}-c $<
lt;

向变量附加更多文本

向已定义的变量值中添加更多文本通常很有用。您可以使用包含 `+=' 的行来执行此操作,如图所示-
objects += another.o
它获取变量对象的值,并向其添加文本"another.o",前面有一个空格,如下所示。
objects = main.o hello.o factorial.o
objects += another.o
以上代码将对象设置为`main.o hello.o factorial.o another.o'。
使用 `+=' 类似于:
objects = main.o hello.o factorial.o
objects := $(objects) another.o

Makefile 中的续行

如果您不喜欢 Makefile 中太大的行,那么您可以使用反斜杠"\"来断开您的行,如下所示-
OBJ =  main.o factorial.o \
   hello.o
is equivalent to
OBJ =  main.o factorial.o hello.o

从命令提示符运行 Makefile

如果您已经准备好名为"Makefile"的 Makefile,那么只需在命令提示符下编写 make,它就会运行 Makefile 文件。但是,如果您为 Makefile 指定了任何其他名称,请使用以下命令-
make-f your-makefile-name
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4