如何编写一个Makefile文件(手把手的教你)_Wyatt_zhai_makefile文件编写
目录一、概念理解1、什么是Makefile?2、为何使用Makefile?二、实战代码演示与讲解1 没有makefile的项目是怎么创建运行的1.1 创建文件1.2 查看创建的文件1.3 给创建的文件放一点内容1.4 编译运行2、有makefile的项目如何创建运行2.1 删掉自动生成的a.out文件2.2 创建makefile2.3 执行makefile文件2.4 查看目录并运行可执行文件三、代码优化3.1 添加clean信息3.2 简化makefile信息3.2.1 简化第一版3.2.2 简化第二版3...
目录
一、概念理解(彩蛋藏在某个地方)1.1 什么是Makefile?1.2 为何使用Makefile? 二、实战代码演示与讲解2.1 没有makefile的项目是怎么创建运行的2.1.1 创建文件2.1.2 查看创建的文件2.1.3 给创建的文件放一点内容2.1.4 编译运行 2.2 有makefile的项目如何创建运行2.2.1 删掉自动生成的a.out文件2.2.2 创建makefile2.2.3 执行makefile文件2.2.4 查看目录并运行可执行文件 三、代码优化3.1 添加clean信息3.2 简化makefile信息3.2.1 简化第一版3.2.2 简化第二版3.2.3 简化第三版 四、总结一下一、概念理解(彩蛋藏在某个地方)
1.1 什么是Makefile?
C话述中,我们大家食用visual studio开发管理游戏之后,写应用程序进行之后都在使用两个project大型项目材料,但是在材料里边儿编译 .h 和 .c 的材料。 在Linux中,有一两个个叫make的事物,就比较于C话述的集成化开放学习环境,我们公司只需要在make里边创立了文件目录名称,写代碼,make会带我们公司管理系统这个文件目录名称。 只有我们大家搭建的投资活动不叫project,是称是Makefile,打開一家make源环节包,发现了不少Makefile的文书,说这里有不少的投资活动。 在源程序代码包内面,有着 名字叫做makefile的zip信息(m是小写字母),两大命名大全规则同时存在着,那就是有效的,在的开发一名新项目流程的当时,新项目 师普遍就会命名大全规则字叫做Makefile第二步废品回收站教给客户,客户觉着其他Makefile想要涂改,客户涂改后还有新砌后的新项目流程设定为makefile,因此在实行当时,先实行makefile,再实行Makefilezip信息。1.2 为何使用Makefile?
上面提到需要将我们写的大量项目文件管理起来,这里具体讲讲:
这个树形图展示了一个项目中的层级关系,如果我们需要变动3号文件,会发现,牵一发而动全身,改动一个被迫需要改动一堆,为了解放我们,make中编写Makefile就不再需要考虑这些,你把每个文件的依赖关系以指令的形式说明清楚并且保存下来,改动一个即可,会自动帮你修改关联到的其他文件。
二、实战代码演示与讲解
2.1 没有makefile的项目是怎么创建运行的
2.1.1 创建文件
touch main.c tool1.c tool1.h tool2.c tool2.h
使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:
$ touch file #创建一个名为“file”的新的空白文件**
2.1.2 查看创建的文件
要有非常实用的程序设计陋习,创立过后后续看看看时期创立出色ls
2.1.3 给创建的文件放一点内容
vim * -p
vim就是进入文本编辑的命令,按键 i 进入编辑模式,Esc退出编辑模式,:wq 保存退出到终端界面
"tool1.h"
#ifndef TOOL1_H__
#define TOOL1_H__
# 声明函数
void mytoo1(void);
#endif
"tool1.c"
#include <stdio.h>
#incldue "tool1.h"
# 定义函数
void mytool1(void)
{
printf("tool1 print\n");
}
只需要稍微修改一下 tool2.h 和 tool2.c 的文件就好啦。
"tool2.h"
#ifndef TOOL2_H__
#define TOOL2_H__
# 声明函数
void mytoo2(void);
#endif
"tool1.c"
#include <stdio.h>
#incldue "tool2.h"
# 定义函数
void mytool2(void)
{
printf("tool2 print\n");
}
到现在还只有个主变量main了,测验编码以下几点
#include <stdio.h>
#include "tool1.h"
#include "tool2.h"
int main(){
mytool1();
mytool2();
return 0;
}
:wa隐退我们方法(保护一切打开微信的资料)
2.1.4 编译运行
2.2 有makefile的项目如何创建运行
makeile教学视频
讲前小科普:
2.2.1 删掉自动生成的a.out文件
rm a.out
2.2.2 创建makefile
vim进入编辑模式,系统检测没有名为makefile的文件,会自动创建。
如果自己想自定义一个其他名字,比如makefilebuff-demo,可能在make操作时候会有影响。下面会讲。
接下来的写依赖关系的时候,你可能会疑惑gcc命令的一些参数,nb我已经预判到了,我的这篇文章可以帮你解决一小部分疑惑
Linux——gcc -c -o 等参数的解释.
# 自定义依赖关系,源文件(后缀为.c)经过编译汇编生成目标文件(后缀为.o)
# 目标文件执行生成可执行文件(类似与mytool)
mytool:main.o tool1.o tool2.o
# 写gcc命令时候,前面要tab按键一下
# 不写-o参数,生成默认的可执行文件名为a.out,这里我们修改为mytool
gcc main.o tool1.o tool2.0 -o mytool
main.o:main.c
#-Wall 可以看到所有的警告
#-g 可以调试
#-c 只允许执行到汇编步骤,不允许链接。
gcc main.c -c -Wall -g -o main.o
tool1.o:tool1.c
gcc main.c -c -Wall -g -o tool1.o
tool2.o:tool2.c
gcc main.c -c -Wall -g -o tool2.o
保存退出,然后查看一下目录(好习惯),发现有一个makefile的文件啦。
2.2.3 执行makefile文件
直接使用make命令
make -f makefilebuff-demo
make 命令提示符能否利用 -f 继续执行安全使用的makefile。
若是在如果没有施用 -f 所选的情形下,会都按照下的按序完成。
GNUmakefile, makefile 和 Makefile
2.2.4 查看目录并运行可执行文件
可以看到可执行文件已经是其他颜色了,颜色不同代表这文件权限不同。
(./文件名)运行!
第一阶段就可以完结撒花啦!!!!!
预期上,在这里的makefile文本的消息写的并非是10分的规范起来,有的東西一直并没有有写,有的写的太费事。反驳来日趋全面一番
三、代码优化
3.1 添加clean信息
_实际上,正如上面介绍的流程我们已经基本处理完了项目,这个时候我修改了某文件代码保存退出后,就需要重新的执行make指令,但是跟第一次不同的是,这次make指令执行后界面如图,不再展示依赖和被依赖关系。
clean:
# rm 删除指令,删除所有后缀为.o文件,删除mytool这个可执行文件
# -rf 强制删除并且递归删除,否则的话会一直询问我们是否需要删除
rm *.o mytool -rf
执行make clean,发现出现了依赖和被依赖的关系
3.2 简化makefile信息
3.2.1 简化第一版
# OBJS 代替 依赖文件
# CC 代替 gcc
# CFLAGS 代替 编译命令
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g
mytool:$(OBJS)
$(CC) $(OBJS) -o mytool
main.o:main.c
$(CC) main.c $(CFLAGS) -o main.o
tool1.o:tool1.c
$(CC) main.c $(CFLAGS) -o tool1.o
tool2.o:tool2.c
$(CC) main.c $(CFLAGS) -o tool2.o
clean:
rm *.o mytool -rf
3.2.2 简化第二版
# $^ 代替 上面的指令
# RM 代替 rm -f
# $@ 代替 目标文件
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g
mytool:$(OBJS)
$(CC) $^ -o mytool
main.o:main.c
$(CC) $^ $(CFLAGS) -o $@
tool1.o:tool1.c
$(CC) $^ $(CFLAGS) -o $@
tool2.o:tool2.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o mytool -r
这个 $(RM) 运行下来可以看到,替代了 rm和 -f
3.2.3 简化第三版
# 6-11行代码相似性很强,可以提取出一个公式模版
# %.o:%.c
# $(CC) $^ $(CFLAGS) -o $@
# 百分号相当于一个通配符
OBJS=main.o tool1.o tool2.o
CC=gcc
CFLAGS=-c -Wall -g
mytool:$(OBJS)
$(CC) $^ -o mytool
%.o:%.c
$(CC) $^ $(CFLAGS) -o $@
clean:
$(RM) *.o mytool -r
四、总结一下
在这里从零开启接触性的面积makefile,先查询文章材质简略的接触性的面积说一下makefile,遗留下了想象是太难了了解之类义思,麻烦几十四天寻找到小视频播放材质但会写写了这篇总结报告,最大多数就能够对makefile带个相对比较周到的认清。皇冠新体育APP相关的文章
- Android 9.0 蓝牙功能之一:蓝牙音乐_小猿成长_android 音频蓝牙
- Monkey指定页面压测及日志分析_做测试的喵酱
- android 筛选逻辑 recyclerview 选中和取消选中 -内附完整代码_obtainStyle_recyclerview 选中
- Android前沿技术?Compose为啥大厂都布局_守住Android最后的光_compose android
- 【Android实战】2、用 CameraX 实现:preview 预览、imageCapture 拍照、videoCapture 录像、videoAnalysis 分析各帧_呆呆的猫_android
- Android 组件化(一)项目模式管理、模式切换_初学者-Study_project模式转换android模式
- 安装适用于 Android 设备的 Android USB 驱动程序_Kanzi官方_android usb驱动
- 皇冠新体育APP:联发科(MTK)MT6762 安卓核心板 安卓主板_智能汇通科技_mt6762
- Android 11.0 SystemUI 导航栏虚拟按键icon大小改变_安卓兼职framework应用工程师_densitychange
- Android intent传输数据、intent通过bundle传输数据_梨轻巧_intent.putextras(bundle);
- 获取微信开放平台申请移动应用时的应用签名和应用包名_今天超市大减价_微信应用签名
- 皇冠新体育APP:2022 无人直播rtmp推流工具-技术实现与思路_wx_zhibo888_rtmp推流工具
- Flutter WebRtc RTMP 拉流 支持 (Android Ios Web)_彬彬SS_flutter webrtc
- 皇冠新体育APP:【Flutter -- 基础】快速入门 Flutter_Kevin-Dev_flutter快速入门
- 皇冠新体育APP:安卓apk反编译教程_云闲不收_安卓反编译apk
- 皇冠新体育APP:Android国际化多语言切换_自由渴望_android 国际化 不跟随系统