Makefile小结

makefile变量小结 根据相关的知识点,从以下几个方面进行总结。 变量基础 在这里插入代码片 变量当中的变量 在这里插入代码片 变量高级用法 在这里插入代码片 追加变量值 在这里插入代码片 override指示符 在这里插入代码片 多行变量 在这里插入代码片 环境变量 在这里插入代码片 目标变量 在这里插入代码片 模式变量 在这里插入代码片 ... 阅读详情

优快云仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。
本博文对应地址: https://hceng.cn/2017/03/11/Makefile小结/#more
本文主要是记录一些遇到的Makefile知识。

Makefile以韦东山老师第一期裸板视频中的 第8课LCD实验的配套代码lcd_3.5_4.3 中的Makefile为例,该工程有两个Makefile,分别位于根目录和lib目录中:
{% codeblock lang:makefile [根目录Makefile]%}
CC = arm-linux-gcc
LD = arm-linux-ld
AR = arm-linux-ar
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump

INCLUDEDIR := ( s h e l l p w d ) / i n c l u d e C F L A G S : = − W a l l − O 2 C P P F L A G S : = − n o s t d i n c − I (shell pwd)/include CFLAGS := -Wall -O2 CPPFLAGS := -nostdinc -I (shellpwd)/includeCFLAGS:=−Wall−O2CPPFLAGS:=−nostdinc−I(INCLUDEDIR)

export CC LD AR OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS

objs := head.o init.o nand.o interrupt.o serial.o lcddrv.o/
framebuffer.o lcdlib.o main.o lib libc.a

lcd.bin: $(objs)
${LD} -Tlcd.lds -o lcd_elf $^
${OBJCOPY} -O binary -S lcd_elf $@
${OBJDUMP} -D -m arm lcd_elf > lcd.dis

.PHONY : lib/libc.a
lib/libc.a:
cd lib; make; cd …

%.o:%.c
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

clean:
make clean -C lib
rm -f lcd.bin lcd_elf lcd.dis *.o
{% endcodeblock %}


主Makefile总领全局的就这句:
{% codeblock lang:makefile %}
lcd.bin: $(objs)
{% endcodeblock %}
要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o serial.o lcddrv.o framebuffer.o lcdlib.o main.o lib libc.a,所以要先找到这些文件,几个.o,还有一个.a。

  • .o目标文件怎么生成?
    %.o:%.c和%.o:%.S是生成规则,就是依赖于.c或.S文件,使用交叉编译命令生成。
  • .a目标文件怎么生成?
    .a是库文件,到lib子目录里去找,在子目录里用make命令生成。

注:
**链接:**将多.o文件,或者.o文件和库文件链接成为可被操作系统执行的可执行程序(Linux环境下,可执行文件的格式为“ELF”格式)。链接器不检查函数所在的源文件,只检查所有.o文件中的定义的符号。将.o文件中使用的函数和其它.o或者库文件中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相关文件(程序启动文件等)最终生成可执行程序。链接过程使用GNU 的“ld”工具。
**静态库:**又称为文档文件(Archive File)。它是多个.o文件的集合。Linux中静态库文件的后缀为“.a”。静态库中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。使用“ar”工具维护和管理静态库。
**共享库:**也是多个.o文件的集合,但是这些.o文件时有编译器按照一种特殊的方式生成(Linux中,共享库文件格式通常为“ELF”格式。共享库已经具备了可执行条件)。模块中各个成员的地址(变量引用和函数调用)都是相对地址。使用此共享库的程序在运行时,共享库被动态加载到内存并和主程序在内存中进行连接。多个可执行程序可共享库文件的代码段(多个程序可以共享的使用库中的某一个模块,共享代码,不共享数据)。另外共享库的成员对象可被执行(由libdl.so提供支持)。


下面进行分析:

第一至五行:
{% codeblock lang:makefile %}
CC = arm-linux-gcc
LD = arm-linux-ld
AR = arm-linux-ar
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
{% endcodeblock %}

  • 作用:将右边工具链名赋值给左边变量,为了简化书写;
  • 分析:
    1. arm-linux-gcc:编译.c或.s头的C文件或汇编程序;
    2. arm-linux-ld:连接器,把多个.o文件或库文件连接成一个可执行文件;
    3. arm-linux-ar:库管理器,把多个.o文件合并成一个.o文件或静态库文件(.a文件);
    4. arm-linux-objcopy:转换可执行文件的格式;
    5. arm-linux-objdump:生成反汇编;

第七行:
{% codeblock lang:makefile %}
INCLUDEDIR := $(shell pwd)/include
{% endcodeblock %}

  • 作用:将shell命令和include组成的路径立即赋值给左边变量,为了简化书写;
  • 分析:Makefile中调用shell命令:$(shell 命令);

‘ = ’与‘ := ’的区别注: - “ = ”:make会将整个Makefile展开后,再决定变量的值。也就是说,变量的值将会是整个,Makefile中最后被指定的值。看例子:
{% codeblock lang:makefile %}
x = foo
y = $(x) bar
x = xyz
{% endcodeblock %}
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。- “ := ”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
{% codeblock lang:makefile %}
x := foo
y := $(x) bar
x := xyz
{% endcodeblock %}
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。


第八行:
{% codeblock lang:makefile %}
CFLAGS := -Wall -O2
{% endcodeblock %}

  • 作用:将gcc的编译参数赋值给左边变量,为了简化书写;
  • 分析:-Wall显示所有编译错误或警告;-O2优化选项,编译时使用2级优化

第九行:
{% codeblock lang:makefile %}
CPPFLAGS := -nostdinc -I$(INCLUDEDIR)
{% endcodeblock %}

  • 作用:将gcc编译路径参数赋值给左边变量,为了简化书写;
  • 分析:-nostdinc忽略系统库目录(这里我们自定义了printf等系统函数,不能再包含系统文件里的相关函数);-I指定搜索路径;

第十一行:
{% codeblock lang:makefile %}
export CC LD AR OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS
{% endcodeblock %}

  • 作用:将变量传递到下级Makefile,类似于宏;
  • 分析:本文件中指的是生成lib/libc.a库文件时的Makefile;

第十三行:
{% codeblock lang:makefile %}
objs := head.o init.o nand.o interrupt.o serial.o lcddrv.o/
framebuffer.o lcdlib.o main.o lib libc.a
{% endcodeblock %}

  • 作用:定义变量objs,包含了生成目标文件所需的文件,为了简化书写;
  • 分析:一行代码写不完,使用/符号可继续在下行写;

第十六行:
{% codeblock lang:makefile %}
lcd.bin: $(objs)
{% endcodeblock %}

  • 作用:定义生成目标lcd.bin,依赖于objs对象;
  • 分析:执行这条命令时,先生成所有依赖文件,然后依次执行后面三条命令;

第十七行:
{% codeblock lang:makefile %}
${LD} -Tlcd.lds -o lcd_elf $^
{% endcodeblock %}

  • 作用:根据链接脚本lcd.lds链接,输出目的文件lcd_elf,依赖全部文件;
  • 分析:-T指定链接脚本;$^表示全部依赖文件;

第十八行:
{% codeblock lang:makefile %}
${OBJCOPY} -O binary -S lcd_elf $@
{% endcodeblock %}

  • 作用:将lcd_elf文件转换成二进制文件;
  • 分析:-O表示输出格式;-S表示不从源文件中复制重定位信息和符号信息到目标文件中;$@表示全部目标文件;

第十九行:
{% codeblock lang:makefile %}
${OBJDUMP} -D -m arm lcd_elf > lcd.dis
{% endcodeblock %}

  • 作用:将lcd_elf文件反汇编为lcd.dis文件;
  • 分析:-m后面跟的是cpu构架;>表示将这个程序的反汇编程序写入到led.dis这个文件中,在终端中不显示出来;

第二十一行:
{% codeblock lang:makefile %}
.PHONY : lib/libc.a
{% endcodeblock %}

  • 作用:.PHONY伪目标,不要管lib/libc.a文件是否存在,都执行后面的指令;
  • 分析:通常为了避免伪目标和文件重名的这种情况,使用特殊的记“.PHONY”来显示地指明一个目标是“伪目标”;

第二十二、二十三行:
{% codeblock lang:makefile %}
lib/libc.a:
cd lib; make; cd …
{% endcodeblock %}

  • 作用:执行lib文件夹的Makefile,从而生成libc.a;
  • 分析:执行shell指令,进入lib目录,make,退出;

第二十五至二十九行:
{% codeblock lang:makefile %}
%.o:%.c
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
{% endcodeblock %}

  • 作用:依赖所有的.c和.S文件,生成所有的.o文件;
  • 分析:%通配符;-c编译不链接; @ 表 示 目 标 文 件 ; @表示目标文件; @表示目标文件;<表示第一个依赖文件;

第三十一至三十三行:
{% codeblock lang:makefile %}
%.o:%.S
clean:
make clean -C lib
rm -f lcd.bin lcd_elf lcd.dis *.o
{% endcodeblock %}

  • 作用:清理所有生成文件;
  • 分析:-C lib即清理包括lib文件夹下生成的文件;

下面是lib目录Makefile:

{% codeblock lang:makefile [lib目录Makefile]%}
objs := div64.o lib1funcs.o ctype.o muldi3.o printf.o string.o/
vsprintf.o

libc.a: $(objs)
${AR} -r -o $@ $^

%.o:%.c
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

clean:
rm -f libc.a *.o

{% endcodeblock %}


第一、二行:
{% codeblock lang:makefile %}
objs := div64.o lib1funcs.o ctype.o muldi3.o printf.o string.o/
vsprintf.o
{% endcodeblock %}

  • 作用:定义变量objs,包含了生成目标文件所需的文件,为了简化书写;
  • 分析:一行代码写不完,使用/符号可继续在下行写;

第四、五行:
{% codeblock lang:makefile %}
libc.a: $(objs)
${AR} -r -o $@ $^
{% endcodeblock %}

  • 作用:使用库管理器生成lib.a;
  • 分析: @ 表 示 目 标 文 件 ; @表示目标文件; @表示目标文件;^所有依赖文件;

第七至十一行:
{% codeblock lang:makefile %}
%.o:%.c
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
{% endcodeblock %}

  • 作用:依赖所有的.c和.S文件,生成所有的.o文件;
  • 分析:%通配符;-c编译不链接; @ 表 示 目 标 文 件 ; @表示目标文件; @表示目标文件;<表示第一个依赖文件;

第十三、十四行:
{% codeblock lang:makefile %}
%.o:%.S
clean:
rm -f libc.a *.o
{% endcodeblock %}

  • 作用:清理所有生成文件;
  • 分析:-f强制删除;

参考博文:sekon LCD实验学习笔记(一):Makefile

makefile与ld介绍1 Ld简介链接器把一个或多个输入文件合成一个输出文件.输入文件: 目标文件或链接脚本文件.输出文件: 目标文件或可执行文件.目标文件(包括可执行文件)具有固定的格 立即下载

相关推荐

如何使用3D高斯分布进行环境建模

使用3D高斯分布来进行建模,关键在于通过引入不确定性描述来提高建图的鲁棒性和精度。与传统点云表示相比,3D高斯分布提供了一种更为灵活和有效的方式来处理空间数据,能够通过协方差矩阵表示点的空间不确定性,帮助优化SLAM过程中的定位和地图更新。

JaydenQ的博客 2355

Makefile进阶篇之LD

Makefile进阶篇 概述 上一张Makefile之初级篇 描述了如何编写一个简单的Makefile。如上一篇所说,生成可执行文件包含了两个过程: 编译 + 连接。 如果没有特别指定需要使用的ld文件,连接阶段就会使用gcc 的默认ld文件; 如果需要使用特别的ld 文件,可以使用如下命令: arm-linux-ld -Tlink.lds sample1.o sample2.o main.o...

small_a_black的博客 7869

Arm Neoverse CMN-700 QoS与PrefetchTarget架构解析

在现代多核处理器系统中,内存访问性能优化是提升整体效能的关键。QoS(服务质量)技术通过优先级调控机制,确保关键任务获得更高的缓存带宽和内存访问权限。PrefetchTarget作为预取技术的一种实现,能够显著降低内存访问延迟,特别适用于AI训练和数据库系统等高性能计算场景。Arm Neoverse CMN-700通过RN SAM模块实现了硬件级的地址范围检测和优先级调控,支持最多8个独立内存区域的QoS配置。测试数据显示,合理配置QoS可使关键任务延迟降低40%,而PrefetchTarget技术则能减少

weixin_36197669的博客 313

在makefile中,CC(编译器)和LD(链接器)代表什么?

Makefile遇到的问题

qq_41470744的博客 3185

飞行器坐标转换

本文定义的是右手直角坐标系,x−y−zx-y-zx−y−z轴分别为北-天-东。从AAA坐标系到BBB坐标系是分别绕y−z−xy-z-xy−z−x轴,即天-东-北旋转ψ−θ−γψ−θ−γ。如果AAA是惯性系,BBB是机体系,则这三个角度分别为偏航角、俯仰角、横滚角。图1 惯性系到机体系。

gongfuyd的博客 1354

Ansys口腔正畸有限元分析:从几何处理到接触设定的全流程解析

本文详细解析了Ansys在口腔正畸有限元分析中的全流程应用,从几何处理到接触设定,帮助医生精准预测牙齿移动趋势。通过有限元建模技术,可同时观察牙齿-牙周膜-牙槽骨的力学响应,显著提升矫治效果预测准确率。文章还分享了实用技巧和参数设置建议,适用于正畸医生和工程师。

weixin_30897233的博客 346

C高级-Makefile

【1】Makefile (1)Make简介 1)工程管理器,顾名思义,是指管理较多的文件 2)Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳 自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作 3)Make将只编译改动的代码文件,而不用完全编译。 (2)Makefile基本结构 Makefile是Make读入...

weixin_42399752的博客 693

【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛。 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口,然后还需要3个IO片选数码管接口,这样大大占用了IO口,导致连接的外设变少。因此我们引入74LS595芯片。电路设计如下: 只需要三个共阴极数码管与三个595芯片级联即可完成,通过RCLK,SCK,SER三个IO即可完成对数码管的动态控制并显示。电路焊接的实物图如下: 要求完成功能:实现数.

XiaoCaiDaYong的博客 8262

Makefile使用细节

变量及通配符 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) ...

还是上会网吧~ 525

【DDR3 控制器设计】(1)MIG IP 核的详解与配置

2:1 比例的用户接口数据总线宽度是 MIG 内存接口宽度的 4 倍,比如 MIG 中配置的数据位宽是 16 位,而 DDR 双边采样,所以用户接口是 MIG 内存接口的 4 倍即数据位宽为 64 位,同理可以得到如果设置为 4:1 则是 8 倍的数据位宽即数据位宽为 128 位。这里选择不使用OFF。以下为 MIG 和 DDR 之间的连接框图,可以看到框图的左边是用户接口,中间是 MIG 核,右边是需要控制的 DDR 接口,用户只需要去配置使用 MIG 核,就可以对 DDR 进行控制读写等操作。

记录学习历程 5358

【win10】win 10 电脑喇叭音频显示红叉的处理方法

目录 一、报错情况 二、“音频服务未运行”解决方法 三、“未插入扬声器或耳机”解决方法 一、报错情况 (1)当电脑的扬声器喇叭图标上带有红X符号,提示“音频服务未运行”时: (2)小喇叭上面有红叉,显示“未插入扬声器或耳机”时: 二、“音频服务未运行”解决方法 (1)开始菜单搜索“服务”: (2)没有启动的点击“启动”,已启动的点击“重新启动”: (3)继续,右...

顾三殇 —— 博客空间(软件测试) 17万+

Makefile 示例

1. PROJECT_PATH=$(shell pwd) $(info ${PROJECT_PATH}) #Source files SOURCE := server.cpp\ tcpServer/TCPServer.cpp\ tcpClient/TCPClient.cpp\ terminalMsgDeal/terminalServer.cpp # OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE))) #targ

帅的没拼音 324

A133在Android13上适配百兆以太网

NOTE] 【技术支持问题】问题背景/平台。

mangofu的博客 412

MakeFile小结

定义 makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。 make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作

stephen0208的博客 1105

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

makefile小结

makefile心得 在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明。一般的格式是:    target:components    TAB rule    第一行表示的是依赖关系。第二行是规则。    比如说我们上面的那个Makefile文件的第二行。    main:main.o mytool1.o

276

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Makefile小结,

最近在学习迷你2440开发板,用到了Makefile,对此做个小总结。 Makefile语法规则:用于说明如何生成目标文件 格式:          target目标:prerequisite依赖         command命令(注意,需要使用TAB键来空格) 范例:       all:led.o arm-linux-ld  -Tled.lds  -o  led.elf  le

badagougou的博客 383

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

makefile 个人小结

自己断断续续的结束了

onephone的专栏 980

Makefile学习小结

正在学习正点原子的Linux教程,对于一个只学了STM32没有接触过Linux的人来说,在ubuntu编程中的Makefile文件着实晦涩难懂!!!!于是就去研究分析了一番,做了一个小小的总结。内容是初级的,代码程序来自正点原子教学代码。 CROS_COMPILE ?= arm-linux-gnueabihf- //变量的定义。“A?=B”的意思:如果变量A没有被赋值过,就赋值等号后面的B的值。...

weixin_44378239的博客 462

makefile 学习小结

makefile 学习小结 jianshan.hu@swift.cn ChongQing, China 前置条件:   linux cmd 、匹配模式 核心机制:   文件依赖、自动推导、   $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件. 参考资料: 《跟我一起学makefile》 《GNU make中文手册》 转载于:https://www.cnbl...

weixin_30364147的博客 93

Makefile使用小结

Makefile使用小结

reason的博客 835
上一篇: 汇编指令小结
下一篇: Linux常用命令
hceng_blog
博客等级 码龄10年 263粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值