当前位置: 首页 > news >正文

makefile(详细讲解)

目录

  • 1.makeflie
  • 2.多个文件执行makefile

1.makeflie

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
我们使用makefile就在当前目录下创建makefile/Makefile前单字母大写小写都可以。
makefile里面会有什么东西呢?
makefile里面会有依赖关系
依赖关系 :比如有个可执行文件test,但是想有它就要有test.c这个就叫做依赖关系,而使用test.c形成test这个就叫依赖方法
了解了这个我们就来正式使用makefile
在马克file输入下面代码,注意第二行不是用空格,一定要用TAB键
在这里插入图片描述
我们再把mytest.c文件给写上
在这里插入图片描述
这个时候我们就可以直接make,再运行make生成的可执行文件运行就行了
在这里插入图片描述

但是我们想要清理文件怎么办
vim makefile
在这里插入图片描述
改成那样就可以了.PHONY这是一个伪目标
输入 make clean就可以清除mytest可执行文件了
在这里插入图片描述
而至于为什么默认make是会执行make mytest而不是make clean是因为make mytest在上面,因为它是从上往下默认形成的
.PHONY:相当于makefile的语法格式中的一个关键字
比如clean被.PHONY修饰时,表明:总是被执行的
那么我们先来了解下总是不被执行的,比如下面的make 因为生成了mytest
所以接下的make除了第一次创建以外都会报错
在这里插入图片描述
而总是被执行就不会有这种问题,想执行多少次就执行多少次
在这里插入图片描述
但是它是怎么区分目标文件的新旧的
在这里插入图片描述
Access表示读取或者进入的时间
再了解下面二个,我们先回忆下文件 = 内容加属性
Modify表示内容变了的时间
Change表示属性变了的时间
看下面图片我们只改变了属性,可以看到只有change时间变了
在这里插入图片描述
但是这里要注意修改了内容,可能会改变属性,因为改变了内容,大小可能会发生变化
那么我们现在就来证明,因为旧文件比新文件生成的旧那么就不生成
在这里插入图片描述
那么我们来用touch来改下Modiy的更新时间看看make会不会成功,我们不改原代码
在这里插入图片描述
可以看到重新生成了

2.多个文件执行makefile

依次创建以下文件
test.c

#include"test.h"


void show()
{
  printf("hello hello hello \n");
}

test.h

#include<stdio.h>


extern void show();

main.c

#include"test.h"

int main()
{
  show();
  return 0;
}

makefile文件

hello:main.o test.o
		gcc -o hello main.o test.o
main.o:main.c
		gcc -c main.c -o main.o
test.o:test.c
		gcc -c test.c -o test.o
.PHONY:clean
clean:
		rm -f *.o hello

在这里插入图片描述

相关文章:

  • Java递归实现迷宫问题和八皇后
  • 软件测试面试题及答案,2022最强版
  • 2.采药-01背包
  • 语法基础(函数)
  • 这几个小插件助你快速提升工作效率
  • Java毕业设计-校园活动赞助与宣传管理系统
  • APS智能排产帮助企业做好生产管理
  • 基于数字孪生的管道数字化平台建设要点
  • Ubuntu系统下安装OpenCV,pytorch,TensorFlow教程
  • shell脚本之数组
  • 智能人体存在感知方案,毫米波雷达感应器成品,智能化感知联动应用
  • 主流跨域方式解析!
  • MMDetection3D简单教程:模型定义、注册与搭建
  • 国内代码托管中心-码云(九)——Git
  • 2022年9月1日:Visual Studio Code 中的 GitHub 简介(未做完)
  • [Vue CLI 3] 配置解析之 css.extract
  • CAP理论的例子讲解
  • E-HPC支持多队列管理和自动伸缩
  • gitlab-ci配置详解(一)
  • JavaScript学习总结——原型
  • MySQL主从复制读写分离及奇怪的问题
  • node学习系列之简单文件上传
  • php ci框架整合银盛支付
  • quasar-framework cnodejs社区
  • SAP云平台里Global Account和Sub Account的关系
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 百度地图API标注+时间轴组件
  • 对象管理器(defineProperty)学习笔记
  • - 概述 - 《设计模式(极简c++版)》
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 通过几道题目学习二叉搜索树
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 无服务器化是企业 IT 架构的未来吗?
  • 项目实战-Api的解决方案
  • 用简单代码看卷积组块发展
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​渐进式Web应用PWA的未来
  • # Panda3d 碰撞检测系统介绍
  • (java)关于Thread的挂起和恢复
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (windows2012共享文件夹和防火墙设置
  • (附源码)计算机毕业设计高校学生选课系统
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (学习日记)2024.01.09
  • (一)SpringBoot3---尚硅谷总结
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .naturalWidth 和naturalHeight属性,
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Framework与.NET Framework SDK有什么不同?