【ARM 嵌入式 编译 Makefile 系列 18 -- Makefile 中的 export 命令详细介绍】

文章目录

    • 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

在这个例子中,CFLAGSLDFLAGS 被导出到环境中,所以当顶层 Makefile 调用 subdir 目录中的 Makefile 时,subdir 的 Makefile 将能够访问这些环境变量。

在子 Makefile 中,你可以直接使用这些变量,就像它们是在本地定义的一样:

# 子目录的 Makefile 
all: 
	gcc $(CFLAGS) main.c -o main $(LDFLAGS) 

子 Makefile 将使用从顶层 Makefile 继承的 CFLAGSLDFLAGS 变量值。

export 命令在 Makefile 中非常有用,它允许你定义全局环境变量,这些变量可以在整个编译过程中的所有子进程中被访问。这样可以确保环境的一致性,并可以简化复杂项目中 Makefile 的管理。

你可能感兴趣的:(#,Makefile,GCC,系列文章,arm开发,Makefile,export)