嵌入式学习笔记(十二) --Makefile简单配置与使用

举报
王建峰 发表于 2021/11/19 03:19:23 2021/11/19
【摘要】 谈不上什么理解,姑且先记录一下吧。一是方便以后有不懂随时翻来看看,二是以后对Makefile理解深了再做补充吧!     一、Make简介 工程管理器,顾名思义,是指管理较多的文件 Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工...

谈不上什么理解,姑且先记录一下吧。一是方便以后有不懂随时翻来看看,二是以后对Makefile理解深了再做补充吧!

 

 

一、Make简介

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

Makefile是Make读入的唯一配置文件 

 

 

二、Makefile基本书写格式

target  :   dependency_files
TAB  command
例子
hello.o :  hello.c hello.h
gcc  –c  hello.c  –o  hello.o

1)由make工具创建的目标体(target),通常是目标文件或可执行文件
2)要创建的目标体所依赖的文件(dependency_file)
3)创建每个目标体时需要运行的命令(command)

4)注意:命令行前面必须是一个”TAB键”,否则编译错误为:*** missing separator.  Stop.

 

三、Makefile变量

作用:变量用来代替一个文本字符串

 

1.用户自定义变量 

 

a. 递归展开方式VAR=var

递归展开方式VAR=var
例子:
foo = $(bar) 
bar = $(ugh) 
ugh = Huh? 
echo $(foo)来进行查看

优点:它可以向后引用变量
缺点: 不能对该变量进行任何扩展,例如  CFLAGS = $(CFLAGS) -O  会造成死循环
 

b. 简单方式 VAR:=var

简单方式 VAR:=var
m := mm 
x := $(m) 
y := $(x) bar 
x := later 
echo $(x) $(y) 

用这种方式定义的变量,会在变量的定义点,按照被引用的变量的当前值进行展开 

这种定义变量的方式更适合在大的编程项目中使用,因为它更像我们一般的编程语言 

 

2.Makefile 自动变量

$*   不包含扩展名的目标文件名称
$+   所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件
$<    第一个依赖文件的名称
$?    所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@          目标文件的完整名称
$^    所有不重复的目标依赖文件,以空格分开

$%          如果目标是归档成员,则该变量表示目标的归档成员名称

 

3.Makefile 预定义变量

AR     库文件维护程序的名称,默认值为ar。AS汇编程序的名称,默认值为as。
CC     C编译器的名称,默认值为cc。CPP  C预编译器的名称,默认值为$(CC) –E。
CXX    C++编译器的名称,默认值为g++。
FC     FORTRAN编译器的名称,默认值为f77
RM     文件删除程序的名称,默认值为rm -f


ARFLAGS 库文件维护程序的选项,无默认值。
ASFLAGS 汇编程序的选项,无默认值。
CFLAGS  C编译器的选项,无默认值。
CPPFLAGS C预编译的选项,无默认值。
CXXFLAGS C++编译器的选项,无默认值。

FFLAGS FORTRAN编译器的选项,无默认值。

 

4.Makefile 环境变量

1) make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量

2) 如果用户在Makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量 

 

四、一个完整而简单的Makefile配置脚本

 
OBJS=f1.o f2.o
OBJS+=main.o
CFLAGS=-c -Wall
test:$(OBJS)
	gcc $(OBJS) -o test
f2.o:f2.c
	gcc -c -Wall $< -o $@
f1.o:f1.c
	gcc $(CFLAGS) $< -o $@
main.o:main.c
	gcc -c -Wall $< -o $@
.PHONY:clean
clean:
	rm *.o test

test是链接后的可执行文件

f1.o f2.o main.o 是目标文件

clean 用于清理所有 .o的后缀文件,用法 make clean

而 .PHONY:clean确保可以重复执行make clean 这个命令

 

五、关于Make如何使用

1.直接运行make 

make

 

2.选项

 

-C dir读入指定目录下的Makefile
-f  file读入当前目录下的file文件作为Makefile
-i忽略所有的命令执行错误
-I dir指定被包含的Makefile所在目录
-n只打印要执行的命令,但不执行这些命令
-p显示make变量数据库和隐含规则
-s在执行命令时不显示命令

-w如果make在执行过程中改变目录,打印当前目录名

 

 

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/80834037

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。