共1条
1/1 1 跳转至页
我的一段makefile理解文档
只看楼主 1楼
一:简介Make是一个linux下的工具。它接受makefile作为输入。根据makefile的规则对所写的程序进行编译。这个makefile是用户自己编写的。Make的工作原理就是根据各个文件的时间戳,决定哪个文件需要重新编译。如果原文件,准确一点说是规则的依赖文件,比目的要文件新,说明原文件之后肯定被改过了,则要重新编译原文件,否则就不要编译。在每个文件夹底下会有一个以makefile或者Makefile命名的文件。
二 规则一个makefile一般是由像下面的规则构成的:target ... : dependencies ... command ... ...target是目的文件,它是由原文件产生的可执行文件或者是目的文件。也可以是一个动作的名字,比如clean
dependency是用于产生目的文件的输入文件,可能一个目的文件依赖于多个输入文件。
Command是让make执行的动作。一个规则可有多个命令。它们各自另起一行。注意点:每个命令前面必须要放置一个tab字符。
比如下面的makefile:
##################makefile开始###################
OBJS = foo.o bar.o
CC = cc
CFLAGS = -Wall –O –g
myprog : $(OBJS)
$(CC) $(OBJS) –o myprog #行头有一tab
foo. foo.c foo.h bar.h
$(CC) $(CFLAGS) –c foo.c –o foo.o #行头有一tab
bar.o : bar.c bar.h
$(CC) $(CFLAGS) –c bar.c –o bar.o #行头有一tab
clean :
rm foo.o \ #行头有一tab
bar.o
###################makefile结束####################
它就是由一些规则构成的,另外在makefile中可以定义一些变量,以方面后续的引用。在这个makefile的最后,clean这条规则中,就没什么具体的什么目标文件,它的目标只是一个动作而以。可以看到,当一行上的内容太多写不下时,可以用反斜杆\来续行。
由于在makefile中,有隐含规则,所谓隐含规则是这样的,比如下面的编译规则:
foo. foo.c foo.h bar.h
cc –c foo.c –o foo.o #行头有一tab
在隐含规则下,makefile会根据foo. foo.c foo.h bar.h自动的用cc –c foo.c –o foo.o规则去编译编译foo.c文件。所以我们可以省略cc –c foo.c –o foo.o规则,因此上面的makefile文件可以写成:
##################makefile开始###################
OBJS = foo.o bar.o
CC = cc
CFLAGS = -Wall –O –g
myprog : $(OBJS)
foo. foo.c foo.h bar.h
bar.o : bar.c bar.h
clean :
rm foo.o \ #行头有一tab
bar.o
###################makefile结束####################
三 makefile的构成一般来说makefile由下面几个元素构成:显式规则,隐式规则,定义的用户变量,目录,注释语句。
显式规则:就是用户在规则的动作下,用户自己定义的动作集合。
隐式规则:就是在用户不指定目标该执行的动作情况下,由make工具自动生成的默认隐含规则。
变量:就是用户用 = 符号赋值语句的左值,可以在变量定义的之后的语句中引用这个变量。三
目录:就是用include语句包含的别的makefile,在执行一个makefile的时候,可以跳转到别的makefile中去执行,执行完了后再返回到原有的makefile中去运行。
注释:注释语句就是用#开头的一行语句。
Makefile的命名一般命名为makefile或者Makefile,它放置在每一个文件夹底下,然后make工具在执行的时候,会寻找每一个目录文件夹底下的makefile文件,根据里面的规则来编译文件。
四:Makefile的条件编译在makefile中,可以用ifdef,ifndef等等指令字来进行条件指令的编译。比如:ifeq ($(CC),gcc) $(CC) -o foo $(objects) $(libs_for_gcc)else $(CC) -o foo $(objects) $(other_normal_libs)endif上面的语句的意思就是如果编译器用的是gcc编译器的话,则库的引用就用libs_for_gcc库来编译目标文件。如果不是采用的gcc编译器的话,就采用另外的库other_normal_libs来编译目标文件。
条件编译指令还可以和函数结合起来使用,比如下面的规则:archive.a: ...ifneq (,$(findstring t,$(MAKEFLAGS))) +touch archive.a +ranlib -t archive.aelse ranlib archive.aendif如果在MAKEFLAGS变量中没有包含-t编译参数,则添加一个,如果包含了就职金额编译。可以看出,函数的使用,让make在文本处理方面的能力加强了。
除了上面的findstring函数外,还有其他的好多函数,比如:subst,patsubst,strip,filter等等函数,不过在我们的makefile中用到的函数就是findstring函数。
下面就介绍一下这个函数,它的调用方法如下:
$(findstring find,in),如果在in字符串中存在find,则函数的返回值就是find,如果在字符串in中不存在find,则函数返回空。以上就是makefile的基本内容,当然还有好多别的东西,我们了解这么多就足够了。
关键词: 我的 一段 makefile 理解 文档 规则 编
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |