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.mzph.cn/news/44076.shtml

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

相关文章

正则表达式:贪婪与非贪婪模式

正则中的三种模式,贪婪匹配、非贪婪匹配和独占模式。 在这 6 种元字符中,我们可以用 {m,n} 来表示 (*)()(?) 这 3 种元字符: 贪婪模式,简单说就是尽可能进行…

安卓框架中的常见问题汇总

目录 1.安卓操作系统的组件结构图如下 2.问题汇总 1.安卓操作系统的组件结构图如下 2.问题汇总 问题1:安卓框架中的库和应用程序框架之间什么关系? 在安卓系统中,应用程序框架层(Application Framework)是核心应用程…

SpringBoot + Vue 微人事权限组管理模块 (十四)

权限组前端页面制作 权限组管理角色和菜单之间关系&#xff0c;操作员管理着用户和角色之间的关系。 英文的输入框要有个前缀&#xff0c;SpringSecurity里角色英文名需要加一个ROLE_的前缀 上代码 <div><div class"permissManaTool"><el-input pla…

Java --- 二维数组

一、二维数组的定义 public class TwoArrayTest {public static void main(String[] args) {//二维数组声明与初始化//方式1&#xff1a;静态初始化int[][] arr new int[][]{{1,2,3},{1,2,3},{1,2,3}};//方式2&#xff1a;动态初始化int[][] arr2 new int[3][3];arr2[0][1] …

vsCode使用cuda

一、vsCode使用cuda 前情提要&#xff1a;配置好mingw&#xff1a; 1.安装cuda 参考&#xff1a; **CUDA Toolkit安装教程&#xff08;Windows&#xff09;&#xff1a;**https://blog.csdn.net/qq_42951560/article/details/116131410 2.在vscode中添加includePath c_cp…

Oracle Database12c数据库官网下载和安装教程

文章目录 下载安装Oracle自带的客户端工具使用 下载 进入oracle官网 点击下载连接之后右上角会有一个下载 我们只需要数据库本体就够了 运行这个下载器 等待下好之后即可 出现 Complete 之后代表下载成功&#xff0c;然后我们解压即可 安装 双击 双击setup.exe 根据…

借助Midjourney创作龙九子图

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; 《西游记》中有这么一段描写&#xff1a; 龙王道&#xff1a;“舍妹有九个儿子。那八个都是好的。第一个小黄龙&#xff0c;见居淮渎&#xff1b;第二个小骊龙&#xff0c;见住济渎&#xff1b;第三个青背龙&#xff0…

【C# 基础精讲】LINQ to XML查询

LINQ to XML 是 C# 中用于查询和操作 XML 数据的强大工具。它允许您使用 LINQ 查询语法对 XML 文档进行查询、过滤、投影等操作&#xff0c;从而更加方便地处理 XML 数据。本文将详细介绍 LINQ to XML 的基本概念、常见操作以及示例&#xff0c;帮助您了解如何在 C# 中使用 LIN…

Learning to Super-resolve Dynamic Scenes for Neuromorphic Spike Camera论文笔记

摘要 脉冲相机使用了“integrate and fire”机制来生成连续的脉冲流&#xff0c;以极高的时间分辨率来记录动态光照强度。但是极高的时间分辨率导致了受限的空间分辨率&#xff0c;致使重建出的图像无法很好保留原始场景的细节。为了解决这个问题&#xff0c;这篇文章提出了Sp…

生成式AI系列 —— DCGAN生成手写数字

1、模型构建 1.1 构建生成器 # 导入软件包 import torch import torch.nn as nnclass Generator(nn.Module):def __init__(self, z_dim20, image_size256):super(Generator, self).__init__()self.layer1 nn.Sequential(nn.ConvTranspose2d(z_dim, image_size * 32,kernel_s…

JVM——StringTable面试案例+垃圾回收+性能调优+直接内存

JVM——引言JVM内存结构_北岭山脚鼠鼠的博客-CSDN博客 书接上回内存结构——方法区。 这里常量池是运行时常量池。 方法区 面试题 intern()方法 intern() 方法用于在运行时将字符串添加到内部的字符串池stringtable中&#xff0c;并返回字符串池stringtable中的引用。 返…

计算机组成与设计 Patterson Hennessy 笔记(二)MIPS 指令集

计算机的语言&#xff1a;汇编指令集 也就是指令集。本书主要介绍 MIPS 指令集。 汇编指令 算数运算&#xff1a; add a,b,c # abc sub a,b,c # ab-cMIPS 汇编的注释是 # 号。 由于MIPS中寄存器大小32位&#xff0c;是基本访问单位&#xff0c;因此也被称为一个字 word。M…

输入输出+暴力模拟入门:魔法之树、染色の树、矩阵、字母加密、玫瑰鸭

秋招实习刷题网站推荐&#xff1a;codefun2000.com&#xff0c;还有题解博客&#xff1a;blog.codefun2000.com/。以下内容都是来自塔子哥的~ 输入输出 2023.04.15-春招-第三题-魔法之树 //#include<bits/stdc.h> #include<vector> #include<iostream>usin…

Datawhale Django后端开发入门Task01 Vscode配置环境

首先呢放一张运行成功的截图纪念一下&#xff0c;感谢众多小伙伴的帮助呀&#xff0c;之前没有配置这方面的经验 &#xff0c;但还是一步一步配置成功了&#xff0c;所以在此以一个纯小白的经验分享如何配置成功。 1.选择要建立项目的文件夹&#xff0c;打开文件找到目标文件夹…

csapp archlab PartC满分解答

任务 修改ncopy.ys和pipe-full.hcl以尽可能的提高ncopy.ys的运行速度 思路 pipe-full.hcl&#xff1a; 实现iaddq指令&#xff08;家庭作业4.54&#xff09;实现加载转发&#xff08;家庭作业4.57&#xff09; ncopy.ys&#xff1a; 使用循环展开&#xff08;第5.8节&…

openai多模态大模型:clip详解及使用

引言 CLIP全称Constrastive Language-Image Pre-training&#xff0c;是OpenAI推出的采用对比学习的文本-图像预训练模型。CLIP惊艳之处在于架构非常简洁且效果好到难以置信&#xff0c;在zero-shot文本-图像检索&#xff0c;zero-shot图像分类&#xff0c;文本→图像生成任务…

windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动

前两天由于项目需要&#xff0c;一个windows上的批处理任务&#xff08;kitchen.bat&#xff09;&#xff0c;需要接到mq的消息通知后执行&#xff0c;为了快速实现这里我们通过springboot写了一个jar程序&#xff0c;用于接收mq的消息&#xff0c;并调用bat文件。 本程序需要实…

缺少或找不到vcruntime140_1.dll的解决方法

某天&#xff0c;当我准备打开电脑上的一个应用程序时&#xff0c;突然收到一个错误提示&#xff0c;显示缺少了vcruntime140_1.dll文件。这个文件是一个重要的系统组件&#xff0c;它的丢失导致了我无法正常运行该应用程序。于是&#xff0c;我开始了一场寻找和修复旅程。然而…

这是我的纪念日

我的1460天 写这篇文章&#xff0c;是为了纪念自己这一千多个日日夜夜&#xff0c;我的热爱总算有了回报。 每次看到有小伙伴点赞&#xff0c;评论的时候&#xff0c;我都很开心&#xff0c;我知道自己的选择是正确的&#xff0c;我喜欢分享自己的所见所学&#xff0c;我也很…

python3.7 安装pywin32报错,完美解决方法

本机环境 python&#xff1a;3.7 遇到2种报错 第一种 ImportError: DLL load failed: The specified module could not be found.第二种&#xff1a; import win32gui ModuleNotFoundError: No module named ‘win32gui‘解决方法 我安装pywin32时候&#xff0c;是直接pi…