文章目录
- Makefile 中的 export 命令详细介绍
- Makefile 使用 export
- 导出与未导出变量的区别
- 示例:导出变量以供子 Makefile 使用
Makefile 中的 export 命令详细介绍
在 Makefile 中,export
命令用于将变量从 Makefile 导出到由 Makefile 启动的子进程的环境中。这通常在你需要在 Makefile 中设置环境变量,并确保这些变量在编译过程中启动的任何子 shell 或程序中都是可用的情况下使用。
当你在 Makefile 中导出一个变量时,任何由 make 启动的子进程(比如调用的 shell 脚本或其他程序)都将能够访问该环境变量。
Makefile 使用 export
export
语句通常写在 Makefile 的顶部,但也可以放在 Makefile 中的任何位置。以下是几个 export
的使用示例:
# 导出单个变量
export CFLAGS=-O2 # 导出多个变量
export CC=gcc export CXX=g++ # 使用等号赋值并导出
export LDFLAGS = -L/usr/local/lib # 使用条件赋值(若未定义则赋值)并导出
export LIBS ?= -lm # 导出所有之前定义的变量
export
在上面的示例中,我们导出了多个编译器和链接器选项。这意味着当 make 启动编译命令或其他子进程时,这些变量会成为子进程的环境变量。
导出与未导出变量的区别
如果一个变量没有被导出,那么它只在当前的 Makefile 及其包含的 Makefile 中可用。子进程和子 shell 无法访问未导出的变量。只有被明确导出的变量才能够在子进程的环境中被检测到。
示例:导出变量以供子 Makefile 使用
假设你有一个顶层 Makefile 和一个或多个子目录,每个子目录都有自己的 Makefile。你希望顶层的 Makefile 中的变量对子 Makefile 也是可见的。
export CFLAGS=-O2
export LDFLAGS=-L/usr/local/lib all: $(MAKE) -C subdir
在这个例子中,CFLAGS
和 LDFLAGS
被导出到环境中,所以当顶层 Makefile 调用 subdir
目录中的 Makefile 时,subdir
的 Makefile 将能够访问这些环境变量。
在子 Makefile 中,你可以直接使用这些变量,就像它们是在本地定义的一样:
# 子目录的 Makefile
all: gcc $(CFLAGS) main.c -o main $(LDFLAGS)
子 Makefile 将使用从顶层 Makefile 继承的 CFLAGS
和 LDFLAGS
变量值。
export
命令在 Makefile 中非常有用,它允许你定义全局环境变量,这些变量可以在整个编译过程中的所有子进程中被访问。这样可以确保环境的一致性,并可以简化复杂项目中 Makefile 的管理。