make的使用及Makefile万能模板

news2024/11/17 0:20:47

make的使用及Makefile万能模板

  • 前言
    • 为什么用make
  • make的使用
  • Makefile万能模板

前言

gcc 的编译,是将源码生成可执行程序。
例如:

gcc hello.c -o hello

源码到可执行程序需要四步处理
硬件——》机器语言——》汇编语言——》 高级语言
1)预处理
处理与#号相关的代码(展开头文件,删除无用定义,替换宏定义)

gcc -E xxx.c -o xxx.i

2)编译
检查语法错误;
如果语法有误则报错,如果语法没错则编译成汇编语言

gcc -S xxx.i -o xxx.s

3)汇编
将汇编语言解析成二进制文件(并非纯粹的二进制文件)

gcc -c xxx.s -o xxx.o

4)链接
将目标文件链接库文件生成机器能够识别的二进制文件

gcc xxx.o -o xxx

为什么用make

make工具工程管理器,顾名思义,是指管理较多的文件,Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作。
当项目中包含多个c文件,但只对其中1个文件进行了修改,那用gcc编译会将所有的文件从头编译一遍,这样效率会非常低;所以通过make工具,可以查找到修改过的文件(根据文件时间戳),只对修改过的文件进行编译,这样大大减少了编译时间,提高编译效率。

make的使用

在这里插入图片描述

首先要分文件
第一步: main.c ——》main
第二步: xxxx.c——》多个.c(不同功能函数接口)
第三步: 编写.h头文件
头文件包含:
1.包含其他头文件
2.函数声明
3.构造数据类型
4.宏定义
5.重定义名
6.全局变量

第四步: 引用头文件
系统定义头文件:
#include <stdio.h>
自定义头文件:
#include “func.h”

第五步:Makefile的编写
格式:

   目标:依赖
   <tab> 命令
	fun:func.o main.o
		gcc func.o main.o -o fun
    func.o:func.c
	    gcc -c func.c -o func.o

Makefile万能模板

CC=gcc                  //编译方法gcc
OBJS= main.o __.o __.o  //__填写目标文件文件名
CFLAGS=-c -g -O         //编译器的选项
main:$(OBJS)            //目标文件(main):依赖(所有的OBJS)
	$(CC) $(OBJS) -o $@ //gcc 所有的OBJS -o 目标文件的完整名称
$(OBJS):%.o:%.c         //目标文件(所有的OBJS):依赖(.o 的.c 文件)
	$(CC) $(CFLAGS) $^ -o $@  //gcc 编译 所有不重复的目标依赖文件 -o 目标文件的完整名称
.PHONY:clean
clean:
	rm *.o                    //删除所有.o文件

$:表示取值
1、预定义变量
CC 默认值为cc,与gcc同
RM 默认值为rm -f
CFLAGS 无默认值,一般为c编译器的选项
OBJS 一般为目标文件xx.o
2、自动变量:
$< 第一个依赖文件的名称
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
3、.PHONY:clean——》.PHONY
声明一个伪命令。若之前的目标中有生成可知执行文件名为clean。执行“make clean”时,make会认为clean目标已实现。不执行clean目标对应的指令,用.PHONY声明后,make认为clean是一个指令,“make clean”时会执行clean指令对应的命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【openGauss实战8】Schema的图文解读

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Session与Cookie的区别(三)

中场休息 让我们先从比喻回到网络世界里&#xff0c;HTTP 是无状态的&#xff0c;所以每一个 Request 都是不相关的&#xff0c;就像是对小明来说每一位客人都是新的客人一样&#xff0c;他根本不知道谁是谁。 既然你没办法把他们关联&#xff0c;就代表状态这件事情也不存在。…

微搭低代码从入门到精通08-轮播容器

我们上一篇讲解了基础布局组件&#xff0c;讲解了普通容器和文本组件的用法&#xff0c;本篇我们继续介绍布局组件。 小程序中经常会有个功能是轮播图展示的功能&#xff0c;多张图片可以顺序进行切换。我们学习使用轮播容器的时候&#xff0c;先考虑切换的图片从哪来&#xf…

视频连载09 - 这个为生信学习和生信作图打造的开源R教程真香!!!

点击阅读原文跳转完整教案。1 思考题2 R基础2.1 R安装2.2 Rstudio基础2.2.1 Rstudio版本2.2.2 Rstudio安装2.2.3 Rstudio 使用2.3 R基本语法2.3.1 获取帮助文档&#xff0c;查看命令或函数的使用方法、事例或适用范围2.3.2 R中的变量及其初始化2.3.3 变量类型和转换2.3.4 R中矩…

Python-项目实战--贪吃蛇小游戏(1)

1.贪吃蛇游戏规则贪吃蛇游戏规则如下:1.1开始和结束贪吃蛇初始出现在游戏窗口的左上角位置,体长共有3节游戏过程中&#xff0c;一旦蛇头撞到了窗口的边缘或者身体的其他部位,游戏结束游戏过程中&#xff0c;点击游戏窗口的关闭按钮&#xff0c;或者按下ESC键可以直接退出游戏一…

Java高级-常用类-String、Date、Compare、Other

本篇讲解java常用类 String类 String:字符串&#xff0c;使用一对""引起来表示。 String类被声明为final的&#xff0c;不可被继承。 String实现了Serializable接口&#xff1a;表示字符串是支持序列化的。 ​ 实现了Comparable接口&#xff1a;表示String可以比较…

微搭低代码从入门到精通09-数据容器

我们已经用了两篇的篇幅介绍了微搭的布局组件&#xff0c;包括普通容器、文本、图片、轮播容器。 微搭中还有粗粒度的组件&#xff0c;今天介绍的数据容器就是粗粒度的组件。所谓粗粒度的组件&#xff0c;一般包括基础组件、样式还有默认的事件。数据容器一共包含三种分别是数…

vscode sftp从linux服务器下载文件至本地:No such file or dictionary【已解决】

在服务器跑完程序需要下载数据的时候报错&#xff1a; [warn] ENOENT: no such file or directory, open /home/LIST_2080Ti/.ssh/config load /home/LIST_2080Ti/.ssh/config failed 完整报错内容如下&#xff1a; [02-10 08:38:47] [info] config at /home/LIST_2080Ti {&q…

Arm-Linux子系统的互相Notify

前言&#xff1a; Linux下面不同的子系统一个个的组成了整个系统的运行环节&#xff0c;为了让这些子系统能够互相通讯&#xff0c;有一种叫做&#xff1a;notify chain(通知链)的东西。本篇看下。 概括 所谓通知链&#xff0c;有通知&#xff0c;就有执行的地方。比如A子系统通…

无题

&#xff08;1&#xff09;风国产化替代&#xff1f;全球化&#xff1f;新一代数字化技术升级&#xff1f;云化&#xff08;公有云化&#xff09;&#xff1f;业务线上化&#xff1f;产业互联整合&#xff1f;私有云原生技术可以支撑&#xff1a;国产化替代-新一代数字化技术升…

WPS底层逻辑串讲

文章目录wps页面基本介绍演示文稿功能讲解框架介绍具体功能讲解&#xff1a;1. 另存为2. 输出图片3. 文件打包4. 演示文稿打印5. 文档加密两种方式 ❤文件打开密码 &#xff1a;文档加密--->密码加密--》输入密码即可 ❤文档编辑密码&#xff1a;输出为PDF--->设置即可6.…

【老卫拆书】009期:Vue+Node肩挑全栈!《Node.js+Express+MongoDB+Vue.js全栈开发实战》开箱

今天刚拿到一本新书&#xff0c;叫做《Node.jsExpressMongoDBVue.js全栈开发实战》&#xff0c;做个开箱。 外观 先从外观上讲&#xff0c;这本是全新的未开封的&#xff0c;膜还在。 这本书介绍从技术原理到整合开发实战&#xff0c;以丰富的项目展现全栈开发的一个技巧。 …

ChatGPT如何注册,如何使用(个人版)文末送账号

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

ES8——Generator函数的使用

babel工具插件下载&#xff1a;npm i --save babel-polyfill 引入&#xff1a;polyfill.js进行转码&#xff08;es8->es5&#xff09; 介绍 Generator函数用于生成迭代器 function * (){} yeild: 作用同return类似 {const obj function* () {yield "a";yield 12…

分享! opensource.builders——为您喜爱的应用程序查找开源替代方案

今天和大家分享一个非常有意思的网站, 我们可以从这个网站中找到一些常用软件的开源替代方案, 比如说之前很火Notion, 我们可以找到它的开源替代方案——Appflowy, 并且在 github 上学习部署它的本地版本.好啦, 话不多说, 上地址:网址地址: https://opensource.builders/github…

数据库(三):多版本并发控制MVCC,行锁的衍生版本,记录锁,间隙锁, Next-Key锁(邻键锁)

文章目录前言一、MVCC以及MVCC的缺点1.1 MVCC可以为数据库解决什么问题1.2 MVCC的基本思想1.3 版本号1.4 Undo日志1.5 ReadView1.6 快照读和当前读1.6.1 快照读1.6.2 当前读二、记录锁三、间隙锁四、邻键锁总结前言 一、MVCC以及MVCC的缺点 MVCC&#xff0c;即多版本并发控制…

Linux clock子系统及驱动实例

文章目录基本概念CLK子系统时钟API的使用clock驱动实例1、时钟树2、设备树3、驱动实现fixed_clk固定时钟实现factor_clk分频时钟实现gate_clk门控时钟实现基本概念 晶振&#xff1a;晶源振荡器 PLL&#xff1a;Phase lock loop&#xff0c;锁相环。用于提升频率 OSC&#xff1a…

数据结构与算法这么难,为什么我们还要学习?

文章目录前言1. 数据结构与算法是什么&#xff1f;2. 为什么数据结构与算法很难&#xff1f;3. 如何系统学习数据结构与算法&#xff1f;&#x1f351; 复杂度&#x1f351; 线性表&#x1f351; 树形结构&#x1f351; 图&#x1f351; 排序&#x1f351; 字符串&#x1f351;…

Django框架之站点管理

站点管理 站点: 分为内容发布和公共访问两部分内容发布的部分由网站的管理员负责查看、添加、修改、删除数据Django能够根据定义的模型类自动地生成管理模块使用Django的管理模块, 需要按照如下步骤操作 : 1.管理界面本地化2.创建管理员3.注册模型类4.发布内容到数据库 1.管理…

备战蓝桥杯第一天【二分查找无bug版】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…