Linux基础----Makefile(1)

前言

刚开始学习Linux,这些那真的是新知识,由于感觉将来FPGA的学习会越来越靠近软件的方向发展,所以觉得有必要好好地学习一下嵌入式的东西,因此有必要把学习的过程记录下来,方便自己将来查看。


1. Makefile 3要素数

Makefile的三个要素是 目标、依赖、命令,一个Makefile里面这三个是最基本的东西。

目标最终期望生成的文件
依赖生成目标文件所用到的一些依赖的文件或者依赖的目标
命令每个目标或依赖下面需要执行的一些命令

一个最简单的Makefile的例子如下:

.PHONY:targetb

target_a: target_b target_c
        echo "target_a"

target_b: 
        echo "target_b"

target_c: 
        echo "target_c"                          

在终端中执行这个Makefile的时候,输出的结果如下。
在这里插入图片描述
从这个最简单的例子,就能够看出Makefile最基本的一个执行的过程。首先,最终希望生成的目标是arget_a, 由于这个目标依赖于目标target_btarget_c, 因此,make工具会先去生成这些依赖的目标,所以会一次去生成 target_btarget_c 。因此可以在终端中看到,打印信息,首先打印的是 target_b 的打印信息,然后是target_c的打印信息,最后是target_a 的打印信息。


2. 基本的Makefile管理

2.1 基本的框架

使用make工具进行工程的管理的时候,需要了解基本的语法。对于我这种新手,那还是简简单单地来。两个简单地例子,来帮助自己记忆。
在工程文件夹下有三个文件,分别是 main.c, mp3.c, Makefile. 完成的功能就是最简单的打印信息的功能。其中文件内容如下:

mp3.c
#include<stdio.h>

void play()
{
	printf("play music! \r\n");
}

void stop()
{
	printf("stop music! \r\n");
}

main.c
#include <stdio.h>

int main()
{
	play();
	stop();
	return 0;
}

Makefile
mp3:main.o mp3.o
	gcc  main.o mp3.o -o mp3

main.o:
	gcc -c main.c -o main.o

mp3.o:
	gcc -c mp3.c -o mp3.o

.PHONY:clean


clean:
	rm mp3

在这里插入图片描述
Makefile 的基本实现就是:最终的可执行文件 mp3 依赖于 mp3.cmain.o,这样能够避免直接对源文件进行依赖,在编译的时候,能够加快效率,因为Make工具会去检测当前的这些文件是否有发生改变。这样最终的可执行文件只依赖于 .o文件,若其中的某一个源文件发生了变化,只需要去更新对应的.o文件就可以。
在终端中执行make命令之后,就能得到最终的可执行程序。
在这里插入图片描述

2.2 Makefile中的变量

2.2.1 系统变量

在Makefile中常用的系统变量有系统的编译器,汇编器,make工具等等,由于初学,因此也就先记住这三个就完事儿了。

$(CC)	# 编译器
$(AS) 	# 汇编器
$(MAKE) # make工具

2.2.2 用户变量及其赋值方式

用户自己的变量很好理解,就是在等号左边的变量,可以使用等号来进行赋值,但是在赋值的时候,得小心了,对用户自定义得变量得赋值有几种方式。

赋值方式含义
=延时赋值, 延时赋值得结果,不是立刻赋值给变量的
若一个变量给另一个变量赋值,那么被赋值的变量的
结果就是等号右边变量的结果,若右边的变量值发生
变化,左边被赋值的变量也会发生变化
:=立即赋值, 将值赋值给变量
?=空赋值 , 只有当变量还没有被赋值的时候才会对其进行赋值
+=追加赋值, 在变量原来值得后面追加

这几种赋值得方式得要注意,还挺麻烦的,举个简单的例子:

A?=123	# 空赋值,若变量A没赋值,那么将123赋值给A
B=$(A) 	# 延时赋值,当前A的值赋值给B
C:=$(A) # 立即赋值,将A的值赋值给C
A+=456 	# 追加赋值, 在A原来的值的后面添加456

.PHONY:all

all:
	# system var
	echo "$(CC)"
	echo "$(AS)"
	echo "$(MAKE)"

	# user var
	echo "$(A)"
	echo "$(B)" # 打印当前B的值(为追加赋值后的A的值)
	echo "$(C)" # 打印C的值(为未追加赋值的A的值)

首先进行直接执行make命令,可以看到,最开始A没有赋值,所以将A赋值为123,然后分别对BC 赋值,然后再对A进行追加赋值,从最后打印结果来看,A的值就是最初的123 然后加上追加的456,B由于是延时赋值,所以它的值,是当前A的值,也即是123 456。C由于是立即赋值,所以其结果是赋值的时候的A的值,也就是123。
在这里插入图片描述

2.2.3自动化变量

自动化变量常用的也就三个

$< # 表示目标的第一个依赖
$^ # 表示所有的依赖
$@ # 表示生成的目标
all: targeta targetb
        echo "$<" # $< 表示第一个依赖文件
        echo "$^" # $^ 表示全部的依赖文件
        echo "$@" # $@ 表示目标

targeta:

targetb:

在这里插入图片描述

2.3 对基本框架进行修改

有了上面的基本的概念之后,就可以对之间的最基础的makefile进行修改,从而是Makefile的灵活性提高。

CC=gcc # 指定编译器GCC
TARGET=mp3 # 最终的目标
OBJS=main.o mp3.o # 重定位文件

$(TARGET):$(OBJS)
        $(CC) $^  -o $@ 	# 将所有的.o生成最终的可执行文件

main.o:
        $(CC) -c main.c -o main.o

mp3.o:
        $(CC) -c mp3.c -o mp3.o

.PHONY:clean


clean:
        rm mp3              
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值