当前位置: 首页 > news >正文

【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 的管理。

相关文章:

  • C++学习之路(二)C++如何实现一个超简单的学生信息管理系统?C++示例和小项目实例
  • 4G5G智能执法记录仪在保险公司车辆保险远程定损中的应用
  • ubuntu22.04中ros2 安装rosbridge
  • JVM中判断对象是否需要回收的方法
  • STM32F10x进入低功耗模式
  • HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)
  • 机器学习与计算机视觉 D2
  • 能否在一台电脑上安全地登录多个Facebook账号?
  • AI“胡说八道”?怎么解?
  • 前端JS模块化对外暴露的三种方法
  • Linux C 基于tcp和epoll在线聊天室
  • SpringCloud原理-OpenFeign篇(一、Hello OpenFeign项目示例)
  • PS 计数工具 基础使用方式讲解
  • 如何更有效地进行薪酬调查?
  • Virutalbox安装ubuntu22.04手把手教学
  • 深入了解以太坊
  • 【Linux系统编程】快速查找errno错误码信息
  • jQuery(一)
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Otto开发初探——微服务依赖管理新利器
  • PermissionScope Swift4 兼容问题
  • Python - 闭包Closure
  • Swoft 源码剖析 - 代码自动更新机制
  • Vue2.0 实现互斥
  • 程序员该如何有效的找工作?
  • 漂亮刷新控件-iOS
  • 前端临床手札——文件上传
  • 如何学习JavaEE,项目又该如何做?
  • 我的zsh配置, 2019最新方案
  • 在Mac OS X上安装 Ruby运行环境
  • # 飞书APP集成平台-数字化落地
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (python)数据结构---字典
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转)Linq学习笔记
  • .NET 5种线程安全集合
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net连接oracle数据库
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • []FET-430SIM508 研究日志 11.3.31
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [1204 寻找子串位置] 解题报告
  • [20150321]索引空块的问题.txt
  • [4.9福建四校联考]
  • [BT]BUUCTF刷题第4天(3.22)
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C#] 我的log4net使用手册
  • [CF482B]Interesting Array
  • [codeforces]Levko and Permutation