Makefile使用细节

2023-05-16

###变量及通配符
这里写图片描述

A := $(C)	# 即时变量,此时C未定义,A为空
B = $(C)	# 延时变量,用到B时再确定具体的值
C = abc
C ?= 123	# C不是第一次定义,被忽略
C += 789
D ?= xyz	# D是第一次定义

all:
	@echo A = $(A)
	@echo B = $(B)
	@echo C = $(C)
	@echo D = $(D)

输出:

A =
B = abc 789
C = abc 789
D = xyz 

###函数
这里写图片描述

A = a b c
B = $(foreach v, $(A), $(v).c)	# 取出$(A)中的每一项存到v中,执行$(v).c,最后以空格分隔返回
C = $(B)
C += d.o
D = $(filter %.c, $(C))			# 返回$(C)中所有符合%.c的项
E = $(filter-out %.c, $(C))		# 返回$(C)中所有不符合%.c的项
files := $(wildcard *.c)		# 获取当前目录下所有的.c文件
files_obj := $(patsubst %.c, %.o, $(files))	# 将$(files)中所有符合%.c的项替换为%.o
files_obj2 := $(files:%.c=%.o)	# 效果和patsubat相同


func:
	@echo A = $(A)
	@echo B = $(B)
	@echo C = $(C)
	@echo D = $(D)
	@echo E = $(E)
	@echo files = $(files)
	@echo files_obj = $(files_obj)
	@echo files_obj2 = $(files_obj2)

输出:

A = a b c
B = a.c b.c c.c
C = a.c b.c c.c d.o
D = a.c b.c c.c
E = d.o
files = a.c test.c
files_obj = a.o test.o
files_obj2 = a.o test.o

###实例:

default:
	arm-linux-gcc -c start.s -o OBJ/start.o
	arm-linux-gcc -c LED/led.c -o OBJ/led.o
	arm-linux-gcc -c KEY/key.c -o OBJ/key.o
	arm-linux-gcc -c main.c -o OBJ/main.o
	arm-linux-ld -Ttext=0x42C00000 OBJ/start.o OBJ/led.o OBJ/key.o OBJ/main.o -o OBJ/main.elf
	arm-linux-objcopy -I elf32-littlearm -Obinary OBJ/main.elf main.bin

clean:
	rm *.bin OBJ/*.o OBJ/*.elf

上面是一般的写法;
下面是优雅点的写法:

CC			= arm-linux-gcc
LD 			= arm-linux-ld
OBJCOPY		= arm-linux-objcopy
CFLAGS		= -Wall -g

TARGET		:= main

TOP_DIR 	:= $(shell pwd)
# SRC_DIRS 	:= $(shell ls -F | grep /$)
SRC_DIRS 	:= $(shell find $(TOP_DIR) -maxdepth 1 -type d)

C_SRCS		= $(foreach dir, $(SRC_DIRS), $(wildcard $(dir)/*.c))
C_HEADS		= $(patsubst %.c, %.h, $(C_SRCS))
C_OBJS		= $(patsubst %.c, %.o, $(C_SRCS))
C_OBJS		+= $(TOP_DIR)/start.o

$(TARGET):$(C_OBJS)
	$(shell if [ ! -d $(TOP_DIR)/OBJ ]; then mkdir $(TOP_DIR)/OBJ; fi)
	$(LD) -Ttext=0x42C00000 $^ -o OBJ/$@.elf
	$(OBJCOPY) -I elf32-littlearm -Obinary OBJ/$@.elf OBJ/$@.bin

%.o:%.c %.h
	$(CC) -c -o $@ $<

%.o:%.s
	$(CC) -c -o $@ $<

.PHONY:clean
clean:
	rm -rf $(C_OBJS) OBJ/*.*

测试这段优雅的Makefile后,发现生成的.bin文件下载到板子上运行不了。
原来,ld链接器对文件顺序是有要求的,从左到右,如果a依赖b,则a应该放在b的左边,ld a b,上面的例子,start.o是启动文件,所以start.o应该放在最前头;

C_OBJS		= $(patsubst %.c, %.o, $(C_SRCS))
C_OBJS		+= $(TOP_DIR)/start.o

替换成

C_OBJS		= $(TOP_DIR)/start.o $(patsubst %.c, %.o, $(C_SRCS))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Makefile使用细节 的相关文章

  • JNI 和 Java:ant 调用 make 还是 make 调用 ant?

    我即将第一次进入 JNI Java 本机接口 的世界 以提供从平台特定的 C C 代码到 Java 的文件系统更改通知 除非有人推荐一些我错过的出色的图书馆来做这件事 作为 JNI 的新手 我已经设法找到了很多关于 JNI 接口方面和库生成
  • 当我尝试使用“make”安装某些东西时,为什么我的权限被拒绝?

    我正在尝试安装一些东西 但它抛出了一个错误 Permission denied当我尝试跑步时make on it 我不太喜欢unix linux的通用规则 也不太喜欢用户权限 我最好的猜测是我登录的用户没有运行权限make命令 但希望这是其
  • 链接器输入文件未使用的 c++ g++ make 文件

    我无法弄清楚是什么导致了我在制作项目时不断遇到的错误 i686 apple darwin11 llvm g 4 2 lncurses linker input file unused because linking not done 我的
  • 使用 make 构建多个二进制文件

    我想创建一个 Makefile 在父目录中 来调用其他几个 Makefile 在子目录中 这样我就可以通过仅调用一个父 Makefile 来构建多个二进制文件 每个项目子目录一个 我的研究因在递归 Makefile 上找到大量内容而受到阻碍
  • 如何在 Mac 上使用 Emscripten emcc 和 make 时包含 ncurses

    我正在尝试构建一个项目 即 Angband 的源代码 http rephial org downloads 3 3 angband v3 3 2 tar gz http rephial org downloads 3 3 angband v
  • 如何在 GNU Make 模式规则中包含路径前缀

    考虑以下 foo bar echo lt gt 假设我们有一个文件1 bar 执行的命令很简单echo 1 bar gt 1 foo 然而 当 包含一个路径 而不仅仅是一个文件名 它开始变得挑剔 我的问题是我想在前面添加另一条路径 bar
  • Makefile 头依赖项

    我是使用 make 的新手 并且一直在通过以下方式学习基础知识本教程 http www cs colby edu maxwell courses tutorials maketutor 这是本教程中的最后一个 makefile 示例 IDI
  • 如何在 makefile 中针对特定目标使用 include 指令

    我只想将 include 指令用于特定目标 当不需要目标时 我不想运行其他 makefile 因为这意味着 makefile 是不必要生成的 那么有没有一种方法可以有条件地使用 include 指令 该指令以目标为条件 或者以某种方式使 i
  • Cmake 链接到共享库找不到​​库

    在 Ubuntu 上 我有两个目录 build and src In src my CMakeLists txt文件有以下几行 add executable Test main cpp target link libraries Test
  • /usr/sbin/install 到底有什么作用?

    我正在尝试安装discount https github com Orc discount on my VPS http no de它基于Solaris 设置一些环境变量后编译效果很好 但是安装失败 https gist github co
  • 使用 GNU make “从源代码树中”构建 C 程序

    我想使用 GNU make 工具为我的微控制器构建一个 C 项目 我想以一种干净的方式来做这件事 这样我的源代码在构建后就不会被目标文件和其他东西弄乱 想象一下我有一个名为 myProject 的项目文件夹 其中有两个文件夹 myProje
  • GNU Make 与 patsubst:需要两次替换

    我需要在变量替换的替换中引用词干两次 O23 OROOTS ODIR overx 2wk 3wk mlb 我需要使用相同的词干执行两次替换 但是替换使用patsubst这只做第一个 我们怎样才能同时实现这两点呢 事实上 杰克几乎猜对了 fo
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • 使用 makefile 和静态模式规则进行树外构建

    我正在开发一些在 ARM 上运行的裸机嵌入式代码 因此必须处理整个 ARM 与 THUMB 模式的区别 当前的构建系统使用静态模式规则来确定是否以 ARM 或 THUMB 模式编译文件 ACOBJS o c echo CC c CFLAGS
  • Makefile 和通配符

    好吧 这是我当前的 makefile 设置 有一些文件名为public01 c public02 c等等 我正在尝试使用以下方法为每个人制作目标文件public o带有通配符的标签 public o public c hashtable h
  • 如何不在输出中打印 makefile 中的注释

    我有一个像这样的 makefile install somecommand some explanation for next command lastcommand 发生的事情是评论 some explanation for next c
  • 在 Mac OS X 上的 Makefile 中设置 PATH(但它适用于 Linux)

    我可以在 Linux 上的 Makefile 中设置 PATH 但不能在 Mac OS X 上设置 在 OS X 中 可以设置 PATH 但不会使用 这是一个演示 在带有 bash 4 1 2 1 release 和 GNU Make 3
  • 在 docker 镜像 python:3.9.13-alpine3.16 上使用“pip install psutil”错误:找不到 linux/ethtool.h

    我尝试在 docker 中安装 python 模块 psutilpython 3 9 13 alpine3 16但它报告了以下错误 Building wheels for collected packages psutil Building
  • 如何调用使用 Define 创建的 GNU make 宏?

    在我的 Makefile 中调用 GREP 的两种方式有什么区别吗 我有什么理由应该使用其中之一 两者似乎产生相同的结果 define GREP word 3 shell echo define FOO 0xfff00100 endef a
  • Makefile:对子目录中的所有文件进行操作?

    我正在使用 Makefile 和 GNU make 基于源 Markdown 文件创建各种文档输出目标 这包括使用latex or pdflatex创建 DVI 文件 使用 EPS 或 PS 格式以外的图像会导致错误 我可以在源 Markd

随机推荐

  • 绒毛动物探测器:通过TensorFlow.js中的迁移学习识别浏览器中的自定义对象

    目录 起点 MobileNet v1体系结构上的迁移学习 修改模型 训练新模式 运行物体识别 终点线 下一步是什么 xff1f 我们可以检测到脸部吗 xff1f 下载TensorFlowJS Examples master zip 6 1
  • YOLOv7 在 ML.NET 中使用 ONNX 检测对象

    目录 什么是 YOLO ONNX 模型 执行预测 示例和参考 References 什么是 YOLO YOLO xff08 You Only Look Once xff09 是一种先进的实时目标检测系统 它是一个在COCO数据集上预训练的物
  • 如何转换PyTorch模型并使用OpenVINO™工具包运行它

    注意 xff1a 本文是使用 OpenVINO 2022 1 创建的 如果您想知道如何使用 OpenVINO 2021 4 的旧 API xff0c 请查看 此notebook 尽管 PyTorch 是 AI 训练的绝佳框架 xff0c 可
  • 程序设计思维与实践 Week14 作业

    A Q老师与石头剪刀布 题意 xff1a 每一个大人曾经都是一个小孩 xff0c Q老师 也一样 为了回忆童年 xff0c Q老师 和 Monika 玩起了石头剪刀布的游戏 xff0c 游戏一共 n 轮 无所不知的 Q老师 知道每一轮 Mo
  • 高可用:MongoDB 容器部署

    MongoDB 是一款 NoSQL 数据 xff0c 通常用来存储非结构化数据 xff0c 我们的产品中也有用到 xff0c 例如 xff1a 一些文件存储在 MongoDB 的 GridFS 中 MongoDB 有三种方式来实现高可用 x
  • 在C#语言中监视SQL Server中的实时数据库更改

    目录 介绍 介绍 在本文中 xff0c 我想向您解释如何在不需要 SQL 依赖和服务代理的情况下监视数据库 有许多方法可以监视数据库更改 xff0c 其中一种方法是 SQL 依赖和服务代理 xff0c 但是在本教程中 xff0c 我们将不使
  • 用Python 3编写的Python 3代码生成器

    目录 介绍 使用代码 关于create python prog py 关于variable name 关于parameter type 关于parameter count token 关于parameter switches 有关布尔参数的
  • 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0"[已解决]

    前两天升级系统架构 xff0c 升级后打开网页报错了 xff01 xff01 xff01 详细信息如下 xff1a 未能加载文件或程序集 Newtonsoft Json Version 61 4 5 0 0 Culture 61 neutr
  • 联想拯救者Y7000系统安装之路(Win10系统)

    最近新购得联想拯救者Y7000 xff0c 到手的第一件事情就是重装系统 xff0c 这个大家都懂的 使用F2进入BIOS界面 xff0c 使用F12可进入快速启动选择U盘启动 接下来问题来了 xff0c 我用老毛桃制作的U盘启动盘 xff
  • win10 服务主机:DCOM服务器进程启动器 进程导致电脑卡死解决思路

    新买的笔记本 xff1a 联想拯救者Y7000 系统 xff1a win10专业版 xff08 已经禁用了网上可搜的服务 xff0c 没有win10开始菜单的磁条 xff09 原因 xff1a 总是在开机一段时间后系统卡死 xff0c 只能
  • Windows 全新终端 Windows Terminal

    本项目包含 xff1a Windows TerminalWindows 控制台主机 conhost exe 上述两项目的共享组件ColorTool示例项目 将展示如何使用 Windows Console APIs Windows Termi
  • python项目打包发布详解

    PyInstaller打包Python项目详解 lt h1 gt lt div class 61 34 clear 34 gt lt div gt lt div class 61 34 postBody 34 gt PyInstaller打
  • python批处理打开多个文件

    背景 xff1a 有时候我们需要在服务器上同时运行多个程式 xff0c 但是却需要一个一个的打开 xff0c 比较费时间 xff0c 而且一旦服务器重启后 xff0c 不懂程式运行的人受限于环境及代码原理 xff0c 很难逐个将程式逐个打开
  • 挂载别的系统挂掉的磁盘解决步骤,mount: unknown filesystem type ‘LVM2_member‘ 报错

    挂载别的系统挂掉的磁盘解决步骤 1 在新的虚机添加磁盘 按照下边操作步骤即可使linux系统重新读取并识别到新硬盘 xff1a 1 1 确定主机总线号 xff1a root 64 iNeedle ls sys class scsi host
  • 序设计思维与实践 CSP-M4

    A 题意 xff1a 题目描述 这一天 xff0c TT因为疫情在家憋得难受 xff0c 在云吸猫一小时后 xff0c TT决定去附近自家的山头游玩 TT来到一个小湖边 xff0c 看到了许多在湖边嬉戏的鸭子 xff0c TT顿生羡慕 此时
  • C++ 构造函数详解

    目录 0 什么是构造函数 1 默认构造函数 2 一般构造函数 3 拷贝构造函数 4 转换构造函数 5 移动构造函数 0 什么是构造函数 在定义类的成员函数的时候 xff0c 一般的成员函数与普通的全局函数没有太大的区别 xff0c 在定义函
  • Copilot 简单测评

    年初的时候通过了Copilot的试用申请资格 xff0c 试用到现在也几个月了 xff0c 说一下使用的感受 最开始理解Copilot xff0c 是通过注释来生成代码 xff0c 在这个想法下 xff0c 感觉自己又又又又要失业了 xff
  • iPhone开发【十四】多线程开发之NSThread——子线程模拟耗时操作

    转载请注明出处 xff0c 原文网址 xff1a http blog csdn net m changgong article details 8213964 作者 xff1a 张燕广 实现的功能 xff1a 1 xff09 演示多线程开发
  • 学习c语言的总结

    学习时间 xff1a 早上9点 晚上9点 学习内容 xff1a 利用c语言对 的代码学习 xff0c 并根据自己的理解编写代码 xff0c 最后整合学习的代码和自己理解的代码 xff0c 编写出更优的代码 学习体会 xff1a 对一个问题举
  • Makefile使用细节

    变量及通配符 A 61 C 即时变量 xff0c 此时C未定义 xff0c A为空 B 61 C 延时变量 xff0c 用到B时再确定具体的值 C 61 abc C 61 123 C不是第一次定义 xff0c 被忽略 C 43 61 789