make/Makefile -基本使用

news2024/9/20 22:54:35

文章目录

  • 一、make/Makefile 的认识
    • make
    • Makefile
  • 二、make/Makefile 基本使用
    • 创建项目
    • 清理项目
    • make 指令的使用
  • 三、makefile 的几个语法
    • 关键字 PHONY :
    • $ :
    • 变量 :
  • 四、makefile的语法推导过程

一、make/Makefile 的认识

我们一般使用 Visual Studio(下面简称 VS)时,它会帮我们自动链接文件。100 个源文件,通常会将它们都编译形成 .o 文件,然后全部链接,形成一个可执行程序,VS 自动将各个源文件编译,然后链接了,不用我们操心了。
make/Makefile 就是 Linux 项目的自动化构建工具。

make

make 是一个命令。
在这里插入图片描述

Makefile

Makefile 是一个文件。
是在自己当前目录下需要手动构建的一个文件,保存的是依赖关系和依赖方法。

  • 依赖关系:
    指的是:“ 为什么要帮你?”
    语法:左侧是目标文件,右侧是依赖文件列表。
mytest:mytest.c
  • 依赖方法:
    指的是:“ 怎么帮你?”
    语法:最开始加一个 Tab,然后写方法即可。
	gcc -o mytest mytest.c

二、make/Makefile 基本使用

创建项目

  • 首先创建一个源文件和 makefile 文件
    在这里插入图片描述
    注意: 必须叫 makefile (首字母大小写都可以),因为 make 指令只认识 makefile/Makefile

  • 添加依赖关系和依赖方法
    通过 vim 打开 makefile 文件并进行编辑,添加上依赖关系和依赖方法。
    (如果对 vim 的使用不熟悉,可以翻翻下面这篇文章:vim模式及部分操作)
    在这里插入图片描述
    注意: 依赖方法那行开头要空一个 tab

  • 编辑源文件
    我们为了查看效果,简单写一小段代码:

#include<stdio.h>
int main()
{
	printf("hhhhh\n");
	return 0;
}
  • 外部 make
    在这里插入图片描述
    通过make指令,我们发现它自己实现了 gcc -o mytest test.c 的命令操作,生成了 mytest 可执行程序。
    再次make:
    在这里插入图片描述
    紧接着 make ,发现有提示,表明源文件已经是最新的了。
    源文件没有改动,即使make ,也不会重新编译,源文件改动了,make 才会重新编译。
    另一种方法是使用 .PHONY 修饰目标文件,使其成为一个伪目标,总是被执行。

在这里插入图片描述

清理项目

  • 添加依赖关系和依赖方法

在这里插入图片描述
这个的依赖文件列表为空,不需要依赖任何文件。

  • 外部 make clean
    在这里插入图片描述
    执行 clean 下的代码,删掉了 mytest 文件。
    清理这部分建议用 PHONY 修饰,以保证不管什么情况下,总能执行清理工作。

在这里插入图片描述

make 指令的使用

从上面我们可以看到在编译部分我们使用的是 make ,而清理部分我们使用的是 make clean
其实,make 形成目标文件的时候,默认是从上到下扫描 makefile 文件的,默认形成的是第一个目标文件,所以第一个可以直接使用 make
比如我们将上面的 gccrm 两条指令换个位置:

在这里插入图片描述
结果如下:
在这里插入图片描述
make 指令变成了操作 rm 的指令,而操作 gcc 的指令必须通过 make mytest 来执行。

三、makefile 的几个语法

关键字 PHONY :

修饰目标文件为伪目标,使其总是被执行。

  • 一般不把源文件设置为伪目标
    每次都重新编译,会降低效率:当源文件过多、过大,每次都重新编译,效率降低;如果一个两个源文件出错,每次都全部重新编译,效率也会低。
  • 一般把 clean 设置成伪目标
    可以保证不管什么情况下,总能执行清理工作。

$ :

$@:代表目标文件,$^:代表依赖文件

在这里插入图片描述

变量 :

在开头定义,且等号左右不能加空格,使用时用 $ 引出。
在这里插入图片描述

四、makefile的语法推导过程

make执行一条指令时,先看当前的依赖方法,依赖方法没有办法实现的话,会递归向下,直到能够完成最初的依赖方法,再逆向执行依赖方法,这属于一条指令。
在这里插入图片描述
指向结果:
在这里插入图片描述
可以看到make指令是从最下面一条指令开始执行的,直到向上执行生成了 mytest 文件。


本文到这里就结束了,如果对您有帮助,希望给一个赞哦!🌷
如有错漏,欢迎指正!😄

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

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

相关文章

【秋招笔试题】米小游的植树工

解法&#xff1a;若区间覆盖的最小值大于等于2&#xff0c;则有他没他没影响&#xff0c;反之则不能算。所以一开始差分数组预处理区间加&#xff0c;然后ST表查最小值即可。 package com.sky;import java.util.Scanner; import java.util.Arrays;public class Test1 {static …

代码随想录——合并区间(Leetcode hot14)

题目链接 思路&#xff1a; 合并区间分为两种情况&#xff1a; 前一个数组右边界 > 后一个数组左边界 eg:[1,3],[2,6] > 合并为[1,6]前一个数组右边界 > 后一个数组右边界 eg:[1,6],[2,4] > 合并为[1,6] class Solution {public int[][] merge(int[][] intervals)…

XSS小游戏(题目+解析)DOM破坏!!!

文章目录 一、Ma Spaghet!二、Jefff三、Ugandan Knuckles四、Ricardo Milos五、Ah Thats Hawt六、Ligma七、Mafia方法一&#xff1a;可以用匿名函数来试试方法二&#xff1a;利用toString方法方法三&#xff1a;利用location和hash切片slice 八、Ok, Boomer九、svg十、DOM破坏十…

【Qt】QWidget的focusPolicy属性

QWidget的focusPolicy属性 设置控件获取到焦点的策略。 所谓“焦点”&#xff0c;就是能选中这个元素。 计算机中的“焦点”&#xff0c;对于键盘操作非常明显。 例如&#xff1a;界面上有一个输入框&#xff0c;此时必须要选中这个输入框&#xff0c;接下来键盘按键才会输入到…

数学建模预测类—【非线性回归】

每日格言&#xff1a;赞美那已经失去的&#xff0c;好让回忆变得可爱 前言 本篇我们将会从一般非线性回归求解和多项式回归求解两个方面来具体介绍如何进行建模求解 一、一般非线性回归求解 1、配曲线求解 适用条件&#xff1a;六类基本曲线&#xff1a;倒指数函数曲线&#…

解决docker一直出现“=> ERROR [internal] load metadata for docker.io/library/xxx“的问题

思考了一下&#xff0c;应该是权限的问题&#xff0c;尝试使用密码登录docker&#xff0c;发现还是不行&#xff0c;因为我是在windows搭建了docker hub&#xff0c;所以可能是需要登录才可以下载&#xff0c;其实就是去生成一个令牌&#xff0c;然后登录即可。 登录即可&#…

单调栈《数组模拟》

#include <iostream>using namespace std;const int N 100010;int m; int stk[N], tt;int main() {cin >> m;while (m -- ){string op;int x;cin >> op;if (op "push"){cin >> x;stk[ tt] x;//插入x}else if (op "pop") tt -…

Tmagic-editor低代码底层拖拽库Moveable示例学习

在前面咱们的自研低代码海报制作平台学习分享计划中分享了自己开发的基本拖拽组件&#xff0c;也只是做了最简单的基本实现。真要写产品&#xff0c;更多还是依赖相关的开源优秀库。 文章目录 参考基本拖拽基本缩放基本Scalable基本旋转基于原点的拖拽和旋转关于练习源码 参考 …

谐振功率放大器的基本原理

1LC谐振电路 谐振又称“共振”。振荡系统在周期性外力作用下&#xff0c;当外力作用频率与系统固有振荡频率相同或很接近时&#xff0c;振幅急剧增大的现象。产生谐振时的频率称“谐振频率”。 电工技术中&#xff0c;振荡电路的共振现象&#xff1a; 1&#xff09;电感与电…

刀客doc:这一届奥运营销,伊利和蒙牛谁更滑头?

文 | 刀客Doc 伊利和蒙牛谁赢了&#xff1f; 聊一聊奥运营销&#xff0c;交个朋友加V&#xff1a;efangfeng 今年巴黎奥运营销&#xff0c;我看大家讨论比较多的就是蒙牛和伊利的暗战。 其中有一种声音认为&#xff0c;伊利这次又再一次成功伏击蒙牛。这个观点确实满足了不少…

SAR靶机笔记

SAR 靶机笔记 概述 SAR 是 Vulnhub 上的靶机&#xff0c;大家可以去 vulnhub 网站上去进行下载。 这里有链接&#xff1a; https://download.vulnhub.com/sar/sar.zip 一丶常规的 nmap 扫描 1&#xff09;主机发现 sn 只做 ping 扫描&#xff0c;不做端口扫描 nmap -sn …

回顾加密风险投资15年演变:步履维艰,但总体向上

1. 引言&#xff1a;加密风险投资的历程 过去15年&#xff0c;加密领域经历了从默默无闻到引爆全球金融市场的巨大变迁。风投机构&#xff08;VC&#xff09;在这一过程中扮演了重要角色&#xff0c;推动了区块链和加密货币行业的快速发展。本文将探讨加密风险投资的动态演变&…

转录组8种免疫浸润分析方法整理

探索疾病的免疫微环境是当下研究的热点&#xff0c;因此这也要求我们对免疫浸润分析的各种工具要有所了解&#xff0c;这些工具包括: CIBERSORT&#xff0c;quanTIseq&#xff0c;EPIC (这三种方法可得到不同细胞亚群的百分比结果/绝对丰度), xCell&#xff0c;TIMER&#xff0…

接口基础知识10:详解接口文档

课程大纲 一、接口文档简介 描述系统接口信息的文档&#xff0c;通常由‌后端开发人员编写&#xff0c;用于规定接口的规范&#xff0c;详细说明接口的逻辑和作用、如何调用接口。 接口文档包含的内容&#xff1a; 接口的逻辑和作用&#xff1a;简要描述接口的功能和用途。 …

JavaFX对话框控件-Dialog

JavaFX对话框控件-Dialog 常用属性titleinitOwnerdialogPaneresultConverter 实现方式 与Alert大部分功能类似可以自定义弹出框内容&#xff0c;比较灵活与DialogPane布局配合使用&#xff0c;自定义具体内容 参考DialogPane 常用属性 title 弹出框标题&#xff0c;标题太长…

2024 年了,IT 运维监控系统都有哪些推荐?

大浪淘沙&#xff0c;2024 年的今天&#xff0c;市面上很多监控系统慢慢淡出了大家的视野&#xff0c;而一些新的监控系统也逐渐崭露头角。今天我们就来看看 2024 年的当下&#xff0c;哪些 IT 运维监控系统最值得关注。 Prometheus 毫无疑问&#xff0c;Prometheus 是最值得关…

MySQL InnoDB supremum pseudo-record范围说明

引言 在 MySQL InnoDB 存储引擎中&#xff0c;锁机制是保证数据一致性和事务隔离的重要手段之一。InnoDB 引入了多种锁机制&#xff0c;其中 next-key lock 是实现行锁和间隙锁的关键部分。在 next-key lock 的机制中&#xff0c;supremum pseudo-record 是一个特殊的存在&…

排序算法【归并排序】

一、归并排序算法的原理 如下面数组所示进行归并排序。 对左半部分进行排序操作。 对左半部分进行归并操作。 二、归并排序 #include <stdio.h> #include "test.h"/* 归并排序法* arr:数组的首地址指针* begin:需要排序数组的起始序号* len:数组的长度*/ void…

微信小程序保存图片到相册

申请权限 代码如下 wx.downloadFile({url: image, //仅为示例&#xff0c;并非真实的资源success(res) {// 只要服务器有响应数据&#xff0c;就会把响应内容写入文件并进入 success 回调&#xff0c;业务需要自行判断是否下载到了想要的内容if (res.statusCode 200) {consol…

SpringBoot-04--整合登录注册动态验证码

文章目录 效果展示1.导入maven坐标2.编写代码生成一个验证码图片3.前端如何拿到验证码4. 后端生成验证码5前端代码 效果展示 效果&#xff0c;每次进入页面展现出来不同的验证码。 技术 使用别人已经写好的验证码生成器&#xff0c;生成图片&#xff0c;转为Base64编码&#x…