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

Makefile基础应用

1 使用场景

        在Linux环境下,我们通常需要通过命令行来编译代码。例如,在使用gcc编译C语言代码时,需要使用以下命令。

gcc -o main main.c

        使用这种方式编译代码非常吃力,每次调试代码都需要重新在命令行下重新编译,重复度劳动太多,特别是在大型项目中,源文件数量较多时,需要将可执行程序依赖的源文件一一列举,徒增工作量。在这种情况下,使用makefile可以帮助我们一键完成编译,从而省下很多时间。

2 使用方式

2.1 makefile文件的编写

        首先我们需要进行makefile文件编写。在源文件所在目录下创建一个名为makefile或Makefile的文件,并按如下示例编写文件。

main:main.c func.cgcc -o main main.c func.c

        该makefile文件的第一行为一个依赖关系,冒号左侧为该依赖关系所生成的文件,而冒号右侧为其所依赖的文件。若该makefile文件所在路径下存在main.c和func.c文件,则可以在当前目录下使用make命令,使makefile执行该依赖关系后的指令,将他们编译生成main文件。

make

        makefile文件中也可以存在多个依赖关系,例如下列逐步编译。在这个文件中,若直接使用make指令,则makefile会以第一行依赖关系为基准,先生成main所依赖的main.o。同理,由于main.o依赖于main.s,那么会先生成main.s,以此类推,逐步生成。

main:main.ogcc -o main main.s
main.o:main.sgcc -c main.s -o main.o
main.s:main.igcc -S main.i -o main.s
main.i:main.cgcc -E main.c -o main.i

        这样做的好处是可以控制makefile自动编译的编译进度。假设我们只需要生成其中的main.o文件,我们可以通过以下指令获得。那么makefile只会编译到main.o,而不会继续向后生成main。

make main.o

        事实上,直接使用 make 指令就相当于直接执行 makefile 文件中的第一个依赖关系。

2.2 伪目标

        使用 makefile 时,为了避免重复编译,makefile 会判断所执行的依赖关系是否更新。若源文件未更新,则不会执行依赖关系,从而提高编译效率。

        若想强制执行,则需要将该依赖关系设为伪目标,如下。

.PHONY:main
main:main.cgcc -o main main.c

        伪目标多用于删除已生成的文件,如下,其中 clean: 同样为依赖关系。

main:main.cgcc -o main main.c.PHONY:clean
clean:rm -f main

        这样,我们就可以使用 makefile 实现快速编译和删除了。

make clean

相关文章:

Makefile基础应用

1 使用场景 在Linux环境下,我们通常需要通过命令行来编译代码。例如,在使用gcc编译C语言代码时,需要使用以下命令。 gcc -o main main.c 使用这种方式编译代码非常吃力,每次调试代码都需要重新在命令行下重新编译,重复…...

一个点绕任意点旋转后的点的坐标

在平面坐标上,任意点P(x1,y1),绕一个坐标点Q(x2,y2)逆时针旋转θ角度后,新的坐标设为(x, y)的计算公式: x (x1 - x2)*cos(θ) - (y1 - y2)*sin(θ) x2 ; y (x1 - x2)*sin(θ) (y1 - y2)*cos(θ) y2 ; 另一个场景应用,坐标轴绕…...

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…...

算力100问☞第16问:什么是TPU?

TPU全称是Tensor Processing Unit芯片,中文全称是张量处理单元芯片,是谷歌开发的一种特殊类型的芯片,用于加速人工智能(AI)和机器学习(ML)工作负载。TPU主要针对张量(tensor&#xf…...

Level DB --- SkipList

class SkipList class SkipList 是Level DB中的重要数据结构,存储在memtable中的数据通过SkipList来存储和检索数据,它有优秀的读写性能,且和红黑树相比,更适合多线程的操作。 SkipList SkipList还是一个比较简单的数据结构&a…...

全面解析 JMeter 后置处理器:概念、工作原理与应用场景

在性能测试中,Apache JMeter是一个非常流行的工具,它不仅能够模拟大量用户进行并发访问,还提供了丰富的扩展机制来满足各种复杂的测试需求。后置处理器(Post-Processor)是JMeter中非常重要的组件之一,用于在…...

【视频】二维码识别:libzbar-dev、zbar-tools(zbarimg )

1、简介 ZBar可以使用多个方式识别各种条形码和二维码。 支持的格式有:EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 93、Code 39、Codabar、Interleaved 2 of 5、QR Code和SQ Code 支持的来源有:视频流、图像文件等 libzbar-dev:二维码识别开发库 zbar-tools(zbarimg …...

EasyExcel: 结合springboot实现表格导出入(单/多sheet), 全字段校验,批次等操作(全)

全文目录,一步到位 1.前言简介1.1 链接传送门1.1.1 easyExcel传送门 2. Excel表格导入过程2.1 easyExcel的使用准备工作2.1.1 导入maven依赖2.1.2 建立一个util包2.1.3 ExcelUtils统一功能封装(单/多sheet导入)2.1.4 ExcelDataListener数据监听器2.1.5 ResponseHelper响应值处理…...

志愿者小程序源码社区网格志愿者服务小程序php

志愿者服务小程序源码开发方案:开发语言后端php,tp框架,前端是uniapp。 一 志愿者端-小程序: 申请成为志愿者,志愿者组织端进行审核。成为志愿者后,可以报名参加志愿者活动。 志愿者地图:可以…...

HTML实现 扫雷游戏

前言: 游戏起源与发展 扫雷游戏的雏形可追溯到 1973 年的 “方块(cube)” 游戏,后经改编出现了 “rlogic” 游戏,玩家需为指挥中心探出安全路线避开地雷。在此基础上,开发者汤姆・安德森编写出了扫雷游戏的…...

小白学多线程(持续更新中)

1.JDK中的线程池 JDK中创建线程池有一个最全的构造方法,里面七个参数如上所示。 执行流程分析: 模拟条件:10个核心线程数,200个最大线程数,阻塞队列大小为100。 当有小于十个任务要处理时,因为小于核心线…...

【uni-app多端】修复stmopjs下plus-websocket无心跳的问题

从这篇文章接着向下看: uniapp plus-websocket 和stompjs连接教程 安卓ios手机端有效 - 简书 按照文章的方式,能够实现APP下stmopjs长连接。但是有一个问题,就是会频繁输出 res-创建连接-1- 跟踪连接,会发现连接都会在大约40s后…...

【SLAM文献阅读】基于概率模型的视觉SLAM动态检测与数据关联方法

A dynamic detection and data association method based on probabilistic models for visual SLAM 《基于概率模型的视觉SLAM动态检测与数据关联方法》 2024 摘要: 通常,静态特征采用多视图几何来估计相机姿态和重建环境地图。因此,动态特…...

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。 我们可以…...

Selenium+Java(19):使用IDEA的Selenium插件辅助超快速编写Pages

前言 或是惊叹于Selenium对于IDEA的支持已经达到了这样的地步,又或是由于这个好用的小工具的入口就在那里,它已经陪伴了我这么久,而我这么久的时间却都没有发现它。在突然发现这个功能的一瞬间,真的是喜悦感爆棚,于是赶快写下了这篇文章。希望可以帮助到其他同样在做UI自动…...

Unity 设计模式-单例模式(Singleton)详解

设计模式 设计模式 是指在软件开发中为解决常见问题而总结出的一套 可复用的解决方案。这些模式是经过长期实践证明有效的 编程经验总结,并可以在不同的项目中复用。设计模式并不是代码片段,而是对常见问题的 抽象解决方案,它提供了代码结构…...

OAuth协议详解

一、基本概念 OAuth(Open Authorization)是一种授权协议,用于允许第三方应用程序以受信任的方式访问用户的资源,而无需共享用户的身份验证凭据。OAuth协议的核心目标是在保持用户数据安全的前提下,简化用户在不同应用…...

2024收官之战:车展向下,智驾向上

作者 | 德新 编辑 | 王博 广州车展在上周拉开帷幕,在激烈的车市竞争中,可以说没有一届车展比本届更加「 冰火两重天」。 在本届车展前夕,已经传出不少车企集团面临业务整合的消息,一部分品牌缺席了本届车展,而势头强…...

开源项目-如何更好的参与开源项目开发

开源之谜-提升自我核心竞争力 一、寻找适合自己的开源项目二、像坐牢一样闭关修炼三、最后的实践 开源代码对所有人开放,开发者可以基于现有代码进行扩展和创新,而不是从零开始,参与开源项目可以提升自我的技术能力,丰富个人的经历…...

如何重命名 Conda 环境 - 详细教程

如何重命名 Conda 环境 - 详细教程 前言重命名步骤1. 克隆现有环境2. 验证新环境3. 删除旧环境 实例演示注意事项常见问题解答Q1: 为什么 Conda 没有直接的重命名命令?Q2: 重命名过程会影响环境中的包吗?Q3: 如果克隆过程中断,会怎么样&#…...

自动驾驶之激光雷达

这里写目录标题 1 什么是激光雷达2 激光雷达的关键参数3 激光雷达种类4 自动驾驶感知传感器5 激光雷达感知框架5.1 pointcloud_preprocess5.2 pointcloud_map_based_roi5.3 pointcloud_ground_detection5.4 lidar_detection5.5 lidar_detection_filter5.6 lidar_tracking 1 什么…...

Python毕业设计选题:基于python的豆瓣电影数据分析可视化系统-flask+spider

开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 个人中心 管理员登录界面 管理员功能界面 电影管理 用户管理 系统管理 摘要…...

从 Mac 远程控制 Windows:一站式配置与实践指南20241123

引言:跨平台操作的需求与挑战 随着办公场景的多样化,跨平台操作成为现代开发者和 IT 人员的刚需。从 Mac 系统远程控制 Windows,尤其是在同一局域网下,是一种高效解决方案。不仅能够灵活管理资源,还可以通过命令行简化…...

k8s部署Nginx详细教程

Kubernetes(简称k8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。本文将详细介绍如何使用k8s部署Nginx,包括创建部署配置、创建服务以及如何通过一个命令完成部署和删除。 环境准备 在开始之前&#x…...

PySpark3:pyspark.sql.functions常见的60个函数

目录 一、常见的60个函数 1、col 2、lit 3、sum 4、avg/mean 5、count 6、max 7、min 8、concat 9、substring 10、lower 11、upper 12、trim 13、ltrim 14、rtrim 15、split 16、explode 17、collect_list 18、collect_set 19、asc 20、desc 21、when 2…...

网络爬虫总结与未来方向

通过深入学习和实际操作,网络爬虫技术从基础到进阶得以系统掌握。本节将全面总结关键内容,并结合前沿技术趋势与最新资料,为开发者提供实用性强的深度思考和方案建议。 1. 网络爬虫技术发展趋势 1.1 趋势一:高性能分布式爬虫 随…...

【优先算法】专题——双指针

1.移动零 移动零 题目描述: 思路: 本题我们把数组分块,将非零元素移动到左边,为零元素移动右边。 我们使用双指针算法(利用数组下标来充当指针) 两个指针的作用: cur:从左往右…...

互联网时代的隐私保护

在这个数字化时代,我们的生活与互联网密不可分。打开手机刷刷朋友圈,浏览一下购物网站,约个网约车,点个外卖,这些看似平常的行为都在默默产生着数据足迹。可就在这不经意间,我们的个人信息正在被收集、分析…...

活着就好20241124

今天是周日,一个同样洋溢着休闲与宁静气息的日子。亲爱的朋友们,大家早上好!在经历了一周的忙碌之后,我们终于迎来了这个让人期待已久的休息日。周日,不仅是一个放松身心的绝佳时机,更是我们回归自我、享受…...

镁光MT25QU01GXXX norflash调试笔记

目录 前言一、芯片概述二、数据手册解释1. 数据手册获取2.内容概括 三、几个操作的代码1.复位芯片操作2.读取芯片ID3.擦除芯片扇区4.向芯片存入数据5.读取存储的数据6.其它操作函数 前言 本笔记总结如何使用MCU对nor flash进行数据存储,包括芯片基本介绍&#xff0…...

并行IO接口8255

文章目录 8255A芯片组成外设接口三个端口两组端口关于C口(★) 内部逻辑CPU接口 8255A的控制字(★)位控字(D70)方式选择控制字(D71) 8255A的工作方式工作方式0(基本输入/输…...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…...

《AI大模型开发笔记》——Prompt提示词最佳实践

为什么需要提示词优化 什么是 Prompt enginnering? 提示词:解释一下什么是大语言模型的Prompt enginnering 图1. 什么是Prompt Enginnering? 通过上面ChatGPT的说明,我们可以看到,prompt工程化就是如何写prompt提示…...

Frontend - 防止多次请求,避免重复请求

目录 一、避免重复执行的多种情况 (一)根据用途 (二)根据用户操作 二、具体实现 (一)“Ajax ”结合disabled (防止多次请求),避免多次点击重复请求 1. 适用场景 2. 解决办法 3. 示例 &…...

MongoDB 简介

MongoDB 简介 MongoDB 是一种流行的 NoSQL 数据库管理系统,以其灵活的数据模型、高性能和易于扩展的特点而闻名。本文将详细介绍 MongoDB 的基本概念、特点、使用场景以及如何在实践中应用。 1. MongoDB 基本概念 1.1 文档数据库 MongoDB 是一个文档数据库,它使用 JSON 风…...

Ngrok实现内网穿透(Windows)

Ngrok实现内网穿透(Windows) 什么是内网穿透,内网穿透有什么用 内网穿透(NAT traversal)是一种技术手段,使得位于内网或防火墙后面的设备能够通过外网访问。例如,如果你的计算机、服务器等设备…...

【Python-办公自动化】实现自动化输出模板表格报告

import pandas as pd import numpy as np# 定义时间范围 date_range = pd.date_range(start=2023-11-01, end=2024-10-31, freq=M...

医学AI公开课·第一期|Machine LearningTransformers in Med AI

小罗碎碎念 从这周开始,我计划每个周末录一个视频,分享一些医学人工智能领域的进展。 作为第一期视频,我打算介绍一下机器学习和Transformer在医学AI领域中的应用。 为了准备这期视频,总共做了24页PPT(三部分内容&…...

ESP8266 STA模式TCP服务器 电脑手机网络调试助手

STA模式TCP服务器和手机电脑网络调试助手多连接...

Transformer架构笔记

Attention is All You Need. 3.Model Architecture 3.1 整体架构如图 3.2 Encoder与Decoder Encoder:由 N 6 N6 N6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer:多头注意力和MLP(FFN,前馈神经网络)&…...

初学 flutter 环境变量配置

一、jdk(jdk11) 1)配置环境变量 新增:JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增:%JAVA_HOME%\bin2)验证是否配置成功(cmd运行命令) java java -version …...

【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)

第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网(http://www.apache.org/dyn/closer.cgi/hive/)下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后,需要对文件进行解压。按照Linux系统使用的…...

Postman之newman

系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之newman 1.基础环境node安装1.1.配置环境变量1.2.安装newman和html报告组件 2.newman运行 newman可以理解为,没有…...

Lua 实现继承的一种方式

以下代码来自Loxodon Framework,截取自其中的一段 function class(classname, super)local cls {}cls.__classname classnamecls.__class clscls.base function (self)return cls.superendcls.__type 0cls.super supercls.__index clsif super thensetmetat…...

相机网卡开启巨型帧和关闭节能模式方法

2022 年 8 月 2 日 Tank 阅读次数(ip/1年): 26,796 win10为例子 首先在开始菜单搜索:网络连接 对想要设置的网络右键:属性 点 配置 高级里面找到这三个选项,参考下图设置,螃蟹网卡建议关掉所有节能有关的…...

如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack

今天我们来聊聊如何在 Ubuntu 22.04 服务器上安装 ELK Stack,并集成 Nginx 作为 Web 服务器,同时使用 Let’s Encrypt Certbot 进行 SSL 认证。ELK Stack,包括 Elasticsearch、Logstash 和 Kibana,是一套强大的工具,用…...

Android中的依赖注入(DI)框架Hilt

Hilt 是 Android 提供的一种依赖注入(DI)框架,它基于 Dagger,目的是简化依赖注入的使用,提供更易用的接口和与 Android 生命周期组件的紧密集成。下面是 Hilt 的详细介绍。 为什么选择 Hilt? 依赖注入的优势&#xf…...

笔记记录 k8s操作

docker下载arm架构的镜像 docker pull centos --platform arm64 其中华为鲲鹏、飞腾CPU采用的是ARM架构,龙芯采用的是MIPS架构,而兆芯、海光CPU采用的是X86架构,申威采用的是Alpha架构 docker查看容器的日志文件目录 docker inspect --format={{.LogPath}} containername…...

掌握Go语言中的异常控制:panic、recover和defer的深度解析

掌握Go语言中的异常控制:panic、recover和defer的深度解析 在Go语言的编程世界中,异常处理是一个不可忽视的话题。Go语言提供了panic、recover和defer三个关键字来处理程序中的异常情况。本文将深入探讨这三个关键字的工作原理、使用场景和最佳实践,帮助读者在实际编程中更…...

SpringBoot项目部署到云服务器全流程

文章目录 一、前期准备(一)云服务器选择(二)本地环境准备(三)数据库准备(若项目需要) 二、服务器配置(一)获取服务器信息(二)重置实例…...