make系列之入门

一.欢迎来到我的酒馆

      在本章节介绍make工具。

目录

    • 一.欢迎来到我的酒馆
    • 二.什么是make
    • 三.make与Makefile
    • 四.如何写Makefile

二.什么是make

        你可能会遇到一些名词:GNU,Linux,make。它们是什么,又有什么样的联系?
        在1970年,最早的UNIX系统被开发出来。在UNIX刚开发出来的时候,为了促进UNIX系统的发展,AT&T公司将UNIX源码许可证授权给一些学术机构,许多机构在UNIX源码的基础上开发,开发出了很多类UNIX系统,UNIX系统在这一时期得到非常快速的发展。但是后来,AT&T公司将UNIX商业化并且闭源了,不在将UNIX源码的许可证授权给一些学术机构。为了避免版权纠纷,一个叫Richard M. Stallman的大叔发起了GNU计划,在类UNIX系统上从新开发出一个开源的操作系统。GNU是一个名字递归的缩写(GNU’s Not Unix!)。GNU是一个计划,它的目标是创建一套完全自由的操作系统。Rechard M.Stallman大叔为GNU计划开发著名的GCC和Emacs编辑器,并起草了GNU通用公共许可协议(GNU General Public License,GNU GPL),创造了copyleft的授权方式。所有的GNU程序遵循 "copyleft"原则,既可以拷贝、修改、出售,但源代码必须对每个用户公开,所有用户都可以获得修改后的源码。Rechard M. Stallman设立了自由软件基金会(Free Sofeware Fundation Inc. ,简称FSF)。
        有了GNU计划,大家开始着手开发,开发出了很多项目,比如著名的GCC,GLIBC,还有Rechard M. Sstallman大叔开发的Emacs编辑器,基本上实现了GNU计划,但GNU计划还缺少一个操作系统内核。GNU项目从1990年开始开发GNU HURD,这个GNU HURD项目一直不能完成。这时候,一个叫Linus的同学在Minix的启发下开发了Linux,Linux只是一个系统内核,刚好这正是GNU计划的一部分,于是两者一拍即合,一起发布了GNU Linux。Linux系统启动之后,运行的是gcc,bash,emacs等软件。
        make也是GNU计划的一个项目。GNU make是一个项目构建工具,由Rechard M. Stallman大叔和Roland McGrath开发。

三.make与Makefile

        在准备使用make工具之前,你需要写一个文件名为Makefile,顾名思义,Makefile文件就是一个项目的配置文件信息,由make程序执行。在一个程序中,可执行文件一般需要从object文件(.o文件)更新。一旦你写好了Makefile文件,你就可以在shell里使用make:

make

make工具使用Makefile里面的数据为基础,并且决定哪些文件需要被更新,每个文件的执行过程都记录在Makefile文件里面。Makefile文件告诉make程序如何编译和连接一个程序。

四.如何写Makefile

        一个简单的makefile包含了一个规则,如下面描述的那样:

target : prerequisites recipe 1recipe 2recipe 3......
  • target。目标。通常是一个程序生成的文件名,target一般是可执行文件或object文件(.o文件)。target同样可以是一个执行名称,例如:clean.
  • prerequisite 。依赖条件。它是一个文件,用作输入来创建一个target。一个target通常依赖多个文件。
  • recipe。配方。一个配方可以理解成一个shell命令,在写每个个配方之前,必须敲一个tab键。

接下来,我们开始写一个Makefile。这里我准备通过用一个项目介绍Makefile,cJSON是c语言编写的JSON解码器,代码非常简洁,只有750行代码。先将cJSON项目下载下来,点击这里下载cJSON源代码,解压之后的文件:
在这里插入图片描述
有用的文件:
cJSON.c:写好的函数
cJSON.h :头文件
test.c:测试文件
接下来开始为这个项目创建Makefile文件,使用vim将下面内容粘贴到一个文件中,并命名为Makefile,如下:

all: testtest: test.c cJSON.o cJSON.hgcc -W -Wall -o test test.c cJSON.o -lm cJSON.o: cJSON.cgcc -W -Wall -c -o cJSON.o cJSON.cclean:rm -rf *.o test 

来看一下这个Makefile文件是怎么写的,测试文件test.c用于生成一个可执行文件,它会用到cJSON.h里面的函数,而cJSON.h的函数实现写在cJSON.c中,所以,生成可执行文件的时候需要链接cJSON.o文件,cJSON.c文件编译之后就是一个.o文件了。
下面是对编译参数的介绍:

-W:关闭所有警告信息。
-Wall:打开警告信息。
-o:输出目标文件
-lm:链接库math。
-c:编译目标文件,但不链接。

在当前文件打开命令行,输入命令:make就可以构建整个cJSON项目了。下面来看一些Makefile的执行流程:
在这里插入图片描述

①:target为all,all需要依赖条件test,test文件存在吗 ?执行空命令 :执行②;
②:target为test,test需要依赖条件cJSON.o,cJSON.o文件存在吗 ?执行⑦⑧ :执行④;
④:target为cJSON.o,cJSON.o需要先决条件cJSON.c,cJSON.c文件存在吗 ?执行⑥ : 报错make: *** No rule to make target `cJSON.c’,
⑥:是一条熟悉的gcc命令,写gcc命令之前需要敲一个tab键,执行完⑥后回到④的步骤,此时步骤④的依赖条件都满足了,执行下面的gcc命令⑨,编译test.c文件并且链接cJSON.o文件,生成可执行文件test。
⑩:target为clean,clean没有需要的先决条件,所以默认不会执行,除非指定参数才会执行。

make的执行流程不知道我讲清除没有,有点印象的话,我们赶紧生成一个程序,跑一下cJSON项目。在Makefile的同级目录下打开命令行,输入命令:

make 

如果你按照上面的流程写,不出意外的话,将会得到下面的输出:

gcc -W -Wall -c -o cJSON.o cJSON.c
gcc -W -Wall -o test test.c cJSON.o -lm 
......

上面的两条gcc命令看到之后,是不是觉得很熟悉!这和我们在shell里写的编译命令是一样的!
如果要删除编译的文件,可以执行命令:(这和上面讲到的make执行流程第⑩是一样的指定一个参数执行,就会执行11)

make clean

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【100天精通python】Day41:python网络爬虫开发_爬虫基础入门

目录 专栏导读 1网络爬虫概述 1.1 工作原理 1.2 应用场景 1.3 爬虫策略 1.4 爬虫的挑战 2 网络爬虫开发 2.1 通用的网络爬虫基本流程 2.2 网络爬虫的常用技术 2.3 网络爬虫常用的第三方库 3 简单爬虫示例 专栏导读 专栏订阅地址:https://blog.csdn.net/…

【实战】十一、看板页面及任务组页面开发(二) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十四)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

SAP ME2L/ME2M/ME3M报表增强添加字段(包含:LMEREPI02、SE18:ES_BADI_ME_REPORTING)

ME2L、ME2M、ME3M这三个报表的字段增强,核心点都在同一个结构里 SE11:MEREP_OUTTAB_PURCHDOC 在这里加字段,如果要加的字段是EKKO、EKPO里的数据,直接加进去,啥都不用做,就完成了 如果要加的字段不在EKKO和EKPO这两个…

【C++】开源:跨平台Excel处理库-libxlsxwriter配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Excel处理库-libxlsxwriter配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&…

nginx php-fpm安装配置

nginx php-fpm安装配置 nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。 nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选…

「UG/NX」Block UI 超级截面SuperSection

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

【学习日记】【FreeRTOS】延时列表的实现

前言 本文在前面文章的基础上实现了延时列表,取消了 TCB 中的延时参数。 本文是对野火 RTOS 教程的笔记,融入了笔者的理解,代码大部分来自野火。 一、如何更高效地查找延时到期的任务 1. 朴素方式 在本文之前,我们使用了一种朴…

Databend 开源周报第 106 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 数据脱敏 Data…

iPhone 15受益:骁龙8 Gen 3可能缺席部分安卓旗舰机

明年一批领先的安卓手机的性能可能与今年的机型非常相似。硅成本的上涨可能是原因。 你可以想象,2024年许多最好的手机都会在Snapdragon 8 Gen 3上运行,这是高通公司针对移动设备的顶级芯片系统的更新,尚未宣布。然而,来自中国的…

Docker基础概述

目录 ​编辑 一、Docker简介 二、 Docker与虚拟机的区别 1.1namespace的六项隔离 二、Docker核心概念 2.1镜像 2.2容器 2.3仓库 三、安装Docker 3.1查看 docker 版本信息 四、Docker 镜像操作 4.1搜索镜像 4.2获取镜像 4.3镜像加速下载 4.4查看镜像信息 4.5根据…

Redis五大基本数据类型及其使用场景

文章目录 **一 什么是NoSQL?****二 redis是什么?****三 redis五大基本类型**1 String(字符串)**应用场景** 2 List(列表)**应用场景** 3 Set(集合)4 sorted set(有序集合…

【模拟集成电路】反馈系统——基础到进阶(一)

【模拟集成电路】反馈系统——基础到进阶 前言1 概述2 反馈电路特性2.1增益灵敏度降低2.2 终端阻抗变化2.3 带宽拓展2.4 非线性减小 3 放大器分类4 反馈检测和返回机制4.1 按照检测物理量分类4.2 按照检测拓扑连接分类 5 反馈结构分析6 二端口方法7 波特方法6 麦德布鲁克方法 前…

ajax-axios-url-form-serialize 插件

AJAX AJAX 概念 1.什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest 对象 与服务器通信 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端拿到数据数…

Verilog同步FIFO设计

同步FIFO(synchronous)的写时钟和读时钟为同一个时钟,FIFO内部所有逻辑都是同步逻辑,常常用于交互数据缓冲。 异步FIFO:数据写入FIFO的时钟和数据读出FIFO的时钟是异步的(asynchronous) 典型同步FIFO有三部分组成: (1&#xff0…

基于ssm的CRM客户管理系统(spring + springMVC + mybatis)营销业务信息java jsp源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于ssm的CRM客户管理系统(spring spring…

【数据结构】 单链表面试题讲解

文章目录 引言反转单链表题目描述示例:题解思路代码实现: 移除链表元素题目描述:示例思路解析: 链表的中间结点题目描述:示例:思路解析代码实现如下: 链表中倒数第k个结点题目描述示例思路解析&…

函数性能探测:更简单高效的 Serverless 规格选型方案

作者:拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮,以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…

高校大学生社团管理系统的设计与实现(论文+源码)_kaic

目 录 一、绪论 (一)选题背景 1、社团管理系统的提出 (二)系统设计的原则与目标 1、系统设计原则 2、系统设计目标 二、系统关键技术的分析 (一)JSP技术 (二)Tomcat简介 1、SERVL…

drawio----输出pdf为图片大小无空白(图片插入论文)

自己在写论文插入图片时为了让论文图片放大不模糊,啥方法都试了,最后摸索出来这个。 自己手动画图的时候导出pdf总会出现自己的图片很小,pdf的白边很大如下如所示,插入论文的时候后虽然放大不会模糊,但是白边很大会显…