Linux基础——Makefile

简介

Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员。在 Linux环境下使用GNU 的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile 文件的编写。

所要完成的Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。

make是一个命令工具,它解释Makefile 中的指令。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile在绝大多数的IDE 开发环境中都在使用,已经成为一种工程的编译方法。

注意: 使用Makefile时文件命名必须是Makefile或者makefile,并使用 make 命令编译。

基本规则

最基本的规则:
目标 : 依赖1 依赖2 …
[TAB]命令

例如:对于hello.c这个文件


#include <stdio.h>

int main(void)
{
  printf("helo,word\n");
  return 0;
}

这个是简单的打印出helo,word。
我们在看看如何在Makefile上进行这个程序。

test : hello.o test是目标,它依赖于hello.o文件,执行下面一行的命令。可生成一个test可执行文件
        gcc -o test hello.o
hello.o : hello.c  //hello.o文件依赖于hello.c文件
        gcc -c -o hello.o hello.c

在我们对这些编写完成后输入命令:make看结果。即:
在这里插入图片描述

常用语法

1、通配符
在前面规则介绍里只分析了当依赖文件只有一个的情况。但是当我们的依赖条件多的时候工作量就大了。这个时候就可以引入通配符。
例如有三个文件:

1、main.c
#include <stdio.h>
void fun_a(void);
void fun_b(void);
int main(void)
{
  fun_a(void);
  fun_b(void);
  return 0;
}
2、a.c
#include <stdio.h>

void fun_a(void)
{
  printf("this is a\n");
}
3、b.c
#include <stdio.h>
void fun_b(void)
{
  printf("this is b\n");
}

Makefile文件:

test: a.o b.o main.o
        gcc -o test $^

%.o : %.c
        gcc -c -o $@ $<

Makefile这里我们只用了简单的几行就实现了我们要实现的目的,就是因为我们使用到了通配符。
在这里插入图片描述
常用的通配符:
%.o:表示所用的.o文件
%.c:表示所有的.c文件
$@:表示目标
$<:表示第1个依赖文件
$^:表示所有依赖文件

2、变量
在Makefile里面变量一般分为两种:即使变量和延时变量。
①即使变量
A := xxx ( A的值在定义时即确定)
即使变量使用 “:=” 表示
②延时变量
B = xxx (B的值使用到时才确定)
延时变量使用“=”表示

:= # 即时变量
 = # 延时变量
?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
\+= # 附加, 它是即时变量还是延时变量取决于前面的定义
?=: 如果这个变量在前面已经被定义了,这句话就会不会起效果,
注意:在使用变量的时候使用“$”来引用

例如:
在这里插入图片描述
这里我们看到A是空的,B=ABC 666 D=123;

A为即使变量,在定义时即确定,由于刚开始C的值为空,所以A的值也为空。
B为延时变量,只有使用到时它的值才确定,当执行make时,会解析Makefile里面的所用变量,所以先解析C= ABC,然后解析C += 666,此时,C = ABC 666,当执行:@echo B = $(B) ,B的值为 ABC 666。

常用函数

makefile里面可以包含很多函数,这些函数都是make本身实现的,下面我们来几个常用的函数。引用一个函数用“$”。

1、foreach
语法:$(foreach var,list,text)
这个函数主要的用法是将某一变量替换成目标文件。
例如:
在这里插入图片描述
我们使用foreach函数即将变量A内的内容全部替换成.o文件。

2、filter/filter-out
语法:$(filter pattern…,text) (在text中取出符合patten格式的值)
$(filter-out pattern…,text) (在text中取出不符合patten格式的值)
例如:
在这里插入图片描述
在里面的filter函数中提取符合要求的文件。
而filter-out则相反。

3、Wildcard
语法:$(wildcard pattern) (pattern定义了文件名的格式, wildcard取出其中存在的文件)。
这个函数 wildcard 会以 pattern 这个格式,去寻找存在的文件,返回存在文件的名字。
例如:
在这里插入图片描述
里面为.c文件的正是函数输出的三个文件。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶同学要努力呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值