嵌入式Linux学习-Makefile基本语法:目标、依赖、命令、伪目标.PHONY

本文知识点来自于正点原子、野火电子两平台的教学课程及其课件资料,如若侵权,请私信我删除。本文内容仅作为习题记忆,不包含过多makefile的格式说明。

复制代码
#Makefile 格式
#目标: 依赖的文件或其它目标
#Tab 命令 1
#Tab 命令 2

根据【正点原子】I.MX6U嵌入式Linux驱动开发指南V2.0.1.pdf中的p143页,使用Vi编辑器完成main.c、input.c、calcu.c、input.h、calcu.h文件的编写

进入Linux虚拟机后,右键打开终端设备

复制代码
sudo mkdir makefile
cd makefile
sudo mkdir part_1
cd part_1

在zwh@zwh-virtual-machine:~/makefile/part_1$路径下进行新建文件

例如:

复制代码
sudo vi main.c

main.c

复制代码
#include<stdio.h>
#include"input.h"
#include"calcu.h"

int main(int argc,char*argv[])
{
	int a,b,num;
	input_int(&a,&b);
	num = calcu(a,b);
	printf("%d * %d = %d\r\n",a,b,num);
}

input.c

复制代码
#include<stdio.h>
#include"input.h"

void input_int(int*a,int*b)
{
	printf("input two num:");
	scanf("%d %d",a,b);
	printf("\r\n");
}

calcu.c

复制代码
#include"calcu.h"

int calcu(int a,int b)
{
	return(a*b);
}

input.h

复制代码
#ifndef _INPUT_H
#define _INPUT_H

void input_int(int*a,int*b);
#endif

calcu.h

复制代码
#ifndef _CALCU_H
#define _CALCU_H

int calcu(int a,int b);
#endif

编写完以上五个基础文件后,在当前目录下创建makefile文件

复制代码
sudo vi makefile

进入vi编辑器后输入以下内容(注意,在第三行面前是使用tab键空出)

复制代码
.PHONY:clean
main:main.o input.o calcu.o
        gcc -o main main.o input.o calcu.o
main.o:main.c
        gcc -c main.c
input.o:input.c
        gcc -c input.c
calcu.o:calcu.c
        gcc -c calcu.c

clean:
        rm *.o
        rm main

执行sudo make即可执行makefile文件

执行完后,可以ls查看当前目录下出现了一个特殊颜色标记的main可执行文件

执行./ main可进行测试程序运行

复制代码
./main

输入ls main -l查看文件最新保存时间

复制代码
ls main -l

输入"sudo make 命令"该格式可单步运行makefile中的程序

复制代码
sudo make main.o

输入sudo make clean可清除当前目录下所有的.o结尾的文件,以及main可执行文件

总结:Makefile 管编译,.o 是缓存,main 是成品,clean 是大扫除,日常只 make,不删 .o

问1:为什么执行make后,clean不会继续被执行,而需要自行sudo make clean才能清理呢?

答1:Makefile只有第一个目标是默认执行的主角,其他所有目标都是零件或备用命令,不手动调用就绝不执行!

相关推荐
!沧海@一粟!2 小时前
VMware升级操作指南与常见问题
linux·运维·服务器
是小小张呀2 小时前
Linux系统查看常用命令
linux
Apibro2 小时前
【Linux 】解压/压缩命令全解析:unzip、tar、gzip、bzip2、xz
linux
IMPYLH2 小时前
Linux 的 base32 命令
linux·运维·服务器·bash·shell
7yewh2 小时前
MCU 卷积神经网络部署 · 深度技术指南
linux·嵌入式硬件·ai·嵌入式
无垠的广袤2 小时前
【ChatECNU 大语言模型】基于 Linux 开发板的 OpenClaw 部署方案
linux·人工智能·语言模型
YYYing.2 小时前
【Linux/C++多线程篇(二) 】给线程装上“红绿灯”:通俗易懂的同步互斥机制讲解 & C++ 11下的多线程
linux·c语言·c++·经验分享·ubuntu
荆楚闲人3 小时前
ubuntu下实现自动以root用户开机无密码方式进入桌面
linux·运维·ubuntu
liweiweili1263 小时前
lsof 查看写入日志文件的进程是什么
linux