Linux下 Makefile文件基本语法介绍一

文章介绍了如何使用Makefile简化编译规则,特别是自动化变量的运用,如$@,$<和$^等,以及模式规则%.o:%.c的作用。同时提到了Makefile中的变量定义和预定义变量,如CC和CFLAGS等。
摘要由CSDN通过智能技术生成

一.  Makefile 简化

如下的编译规则写法,当一个项目中的 C 源码文件很多时,如果 Makefile 复杂的时候这种重复输入的工作就会非常费时间。利用 Makefile 自动化变量可以解决这个问题。

main:  main.o  swap.o
    gcc -o main main.o swap.o
为了简化 Makefile 的内容。Makefile 加入了变量的支持。不像 C 语言中的变量有 int、char
等各种类型,Makefile 中的变量都是字符串!类似 C 语言中的宏。除此之外,还有自动化变量,伪目标,条件判断,还有函数的使用等。

二.  Makefile基本语法

1.  Makefile 变量

Makefile 中可以使用变量,代表了一个文本字符串,定义好后可以用美元符号 $ 引用。

变量类似 C的宏定义,在使用中直接展开

  • 变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有 : 、 # 、 = 或是空字符(空格、回车等)。
  • 变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的变量名。
  • 变量在声明时需要给予初值;

  传统的 Makefile 的变量名是全大写的命名方式。

 使用变量时候:一般最好使用 ${ARGs} 或 $(ARGS)  这种括号表示对应的ARGS 变量,前面的变量可以调用后面定义的变量);

如下所示:

#可以相互调用,然后展开

value1 = $(value2) #调用后面定义的变量;

value2= $(value3)

value3 = Huh

all:

    echo $(value1)  #最终的结果就是Hug

有一些预定义的默认变量,历史原因名称已经约定俗成,可以输入命令 “make -p” 打印查看。

这些预定义的变量可分为两类:

  • 表示程序名称(如CC)
  • 表示程序参数(如CFLAGS)

程序名称的常见变量如下:

CC:表示C语言编译程序; 默认值:`cc’

CXX:表示C++语言编译程; 默认值:`g++’

表示程序参数的常见变量,如果没有说明,默认值是空字符串:

CFLAGS:C语言编译程序参数

LDFLAGS: 指定编译器的连接器参数, 默认值:`ld’

除了上述的这些变量名,还有其他的变量名。各种表示的意思可以网上百度。

2.  Makefile 模式规则

Makefile 中的模式规则类似于通配符功能。最常见的通配符: * , 代表一个或多个字符;符号 % 代表非空字符串匹配;

模式规则通过通配符  % 为某一类文件定义编译规则。

所有的 .c 文件多编译为 .o文件,写法如下:

%.o : %.c
    编译命令

注意:在变量定义中使用通配符,当定义变量为*.o 时候: 如果通配符表达式匹配不到任何合适的对象,通配符语句本身就会被赋值给变量;

3. Makefile 自动化变量

上述模式规则中,编译命令即需要涉及 Makefile 的自动化变量

自动化变量:即这种变量会把模式中所 定义的一系列的文件自动的依次取出,直至所有的符合模式文件都取完。
自动化变量只应该出现在规则的命令中。常用的三种: $@ $< $^

自动化变量如下:

$@
规则的目标文件名
$<规则的第一个依赖文件名。如果依赖文件是以模式(即“%)定义的,那么 “$<” 就是符合模式的一系列的文件集合。
$^
所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,
$^ ”会去除重复的依赖文件,值保留一份。
$%
当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,
那么其值为空。
$? 所有比目标新的依赖目标集合,以空格分开。
$+
和“ $^ ”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
$*
这个变量表示目标模式中 "%" 及其之前的部分,如果目标是 test/a.test.c ,目标模
式为 a.%.c ,那么“ $* ”就是 test/a.test

常用的自动化变量有三种:$@$< $^。如下为自动化变量的使用:

objects = main.o input.o calcu.o
main: $(objects)
    gcc -o main $(objects)
 
%.o : %.c
    gcc -c $<   #自动化变量

下一篇继续介绍 Makefile 的一些基本语法规则,包括伪目标,条件判断,函数调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值