makefile简易教程
makefile简易教程
一、学习目标
达到多文件快速编译的需求,相关符号的意思,以及其它注意事项。
二、快速入门
2.1 基本概念
Makefile 是一个在Unix和Linux操作系统上使用的构建工具,用于自动化编译和构建源代码。
2.2 用处
通过Makefile,你可以定义一系列规则来指示如何构建源代码,以及定义每个规则所需要的依赖关系。Makefile也可以在构建过程中执行自定义命令,例如清理旧的构建输出、运行测试等。
2.3 基本语法
目标文件:依赖文件指令
target: dependenciescommand
其中,target
表示构建目标(例如可执行文件、库文件、对象文件等),dependencies
表示构建目标所依赖的文件(可以是其他目标或源代码文件),command
表示构建目标的命令。注意,command
前面必须有一个tab(制表符)。
例如:
test:test.cgcc -o test test.c
2.4 变量
Makefile还支持变量,用于在不同规则之间共享常量或者路径等信息。变量的定义格式如下:
VARIABLE_NAME = variable_value
示例:
CC = gcc
CFLAGS = -Wall -Werrorhello: hello.c$(CC) $(CFLAGS) -o hello hello.c
在这个示例中,CC
变量定义了编译器的名称,CFLAGS
变量定义了编译器的参数。在构建hello
目标时,Makefile使用这些变量来执行编译命令。
2.5 构建多个目标
当有多个.c文件需要进行编译时,可以这样构建makefile
all: hello worldhello: hello.c$(CC) $(CFLAGS) -o hello hello.cworld: world.c$(CC) $(CFLAGS) -o world world.c
在这个示例中,all
是一个伪目标,它依赖于hello
和world
。当我们运行make all
时,Make会自动构建hello
和world
目标。
注意,all
是一个伪目标,它并不会生成任何文件。在Makefile中,有一些特殊的目标(例如all
、clean
等)通常被定义为伪目标。
2.6 清理目标
Makefile还可以定义清理目标,用于删除构建过程中生成的临时文件。例如:
clean:rm -f hello world *.o
在这个示例中,clean
是一个伪目标,它的命令会删除当前目录下的hello
、world
和所有.o
文件。
2.7 .PHONY
在Makefile中,.PHONY
是一个特殊的目标,用于声明一些伪目标(phony target),也就是那些不对应任何实际的文件或目录,只是用来执行一些特定的操作的目标。
声明伪目标的方式很简单,只需要在Makefile中添加以下语句:
.PHONY: target1 target2 ...
其中,target1
、target2
等为伪目标的名称,可以声明多个伪目标,它们之间用空格分隔。
使用.PHONY
声明伪目标的好处在于,它可以避免出现一些潜在的问题,例如:
- 当伪目标与实际文件或目录同名时,Makefile可能会将其误认为是一个文件或目录,从而导致错误的行为。使用
.PHONY
可以显式地声明这些目标是伪目标,避免这种情况发生。 - 如果在命令行中执行
make target
时,target
已经存在,并且其时间戳比依赖文件的时间戳更晚,Makefile默认情况下不会重新构建target
。但是如果target
是一个伪目标,那么即使时间戳较晚,Makefile也会执行伪目标下的命令,因为伪目标并不对应任何实际的文件或目录。
例如,我们可以在Makefile中声明一个名为clean
的伪目标,用于清理项目中生成的临时文件和目录,如下所示:
.PHONY: cleanclean:rm -rf build/* bin/*
在命令行中执行make clean
时,Makefile会执行rm -rf build/* bin/*
命令,清理build
目录和bin
目录中的所有文件。
需要注意的是,.PHONY
目标本身并不会执行任何操作,它只是用来声明伪目标。因此,在Makefile中,.PHONY
目标通常放在文件的最前面或最后面,以方便查看和维护。
2.8 $符号
在Makefile中,@和@和@和^等符号是自动化变量,它们代表了不同的含义:
- $@ 表示当前规则中的目标文件,即被生成的文件名。
- $^ 表示当前规则中所有的依赖文件,以空格分隔。
例如:
makefileCopy code
app: main.o utils.ogcc $^ -o $@main.o: main.cgcc -c $< -o $@utils.o: utils.cgcc -c $< -o $@
在上面的示例中,我们定义了一个目标文件app,它依赖于两个对象文件main.o和utils.o。在生成目标文件时,我们使用将所有依赖文件都链接在一起,使用^将所有依赖文件都链接在一起,使用将所有依赖文件都链接在一起,使用@作为生成的目标文件名。同时,我们还定义了两个规则分别用于生成main.o和utils.o文件,在这里我们使用$<代表当前规则中的第一个依赖文件,即源代码文件名。
2.9 makefile与其它语言冲突
例如我在使用C语言连接MySQL数据库时,使用到的编译选项中含有$()的字样,然而makefile中,这类字样指代某个变量,所以产生冲突,导致无法make成功。
可以将编译选项改为$$(),双美元符号可以提示makefile需要显式调用的。
上述例子如下:
.PHONY:all
all:test_cgi mysql_conntest_cgi:test_cgi.ccg++ -o $@ $^mysql_conn:mysql_conn.ccg++ -o $@ $^ -std=c++11 $$(mysql_config --cflags --libs).PHONY:clean
clean:rm -f test_cgi mysql_conn
相关文章:

makefile简易教程
makefile简易教程 一、学习目标 达到多文件快速编译的需求,相关符号的意思,以及其它注意事项。 二、快速入门 2.1 基本概念 Makefile 是一个在Unix和Linux操作系统上使用的构建工具,用于自动化编译和构建源代码。 2.2 用处 通过Makefi…...

快速入门nginx
目录 1.nginx前言 2.什么是nginx 3.Nginx作用? 1.正向代理 2.反向代理 3.轮询 4.加权轮询 4.Nginx的安装 1.windows下安装 2.linux下安装 5.Nginx常用命令 1.nginx前言 我们公司项目刚刚上线的时候,并发量小,用户使用的少&#…...

甘特图:项目管理工具,轻松简化工作流程
项目规模越大,管理就越复杂,有时候甚至一个项目经理需要管理多个项目,当多个项目、多条任务同时进行,项目所涉及的范围广,内容越来越复杂,使得项目越难以把控,好的管理工具,可以提升…...

刷题专练之翻转题练习
文章目录一、 编写函数实现字符串翻转二、轮转数组总结一、 编写函数实现字符串翻转 描述 编写一个函数,实现字符串的翻转 输入描述: 输入一个字符串 输出描述: 输出翻转后的字符串 写法一: 这种方法是定义begin和end࿰…...
【Java】死锁
一、什么是死锁 死锁指多个线程在执行过程中,因争夺资源造成的一种相互等待的僵局。 进程死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。…...
DS图—图的最短路径(无框架)迪杰斯特拉算法
目录 题目描述 AC代码 题目描述 给出一个图的邻接矩阵,输入顶点v,用迪杰斯特拉算法求顶点v到其它顶点的最短路径。 输入 第一行输入t,表示有t个测试实例 第二行输入顶点数n和n个顶点信息 第三行起,每行输入邻接矩阵的一行&…...

【笔记】数据异常检测与修复总结
文章目录一、异常种类1. 对于移动对象的数据异常2. 对于时序数据的异常检测二、异常数据清洗流程三、数据预处理四、异常检测算法五、异常修复算法六、漂移数据清洗一、异常种类 不同的研究对象,有着不同的异常分类方式 1. 对于移动对象的数据异常 异常数据信息&…...

算法笔记(七)—— 图的相关知识及算法
图的存储方式 1. 邻接表(记录关于某点的直接相邻点) 2. 邻接矩阵(一定是正方形的矩阵,对点进行编号,点到点的权值由距震中的值表示,无直接相连记为正无穷) 图的模板 unordered_map<int,No…...
ssh配置互信时错误解决方法
之前项目中遇到有关配置ssh互信免密登录问题,为避免以后踩坑,现记录一下避坑指南。 1、提示如下错误: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 问题分析:可能是ssh配置问题。 查看日志/var/log/secure&…...
SQL69 返回产品并且按照价格排序
描述有Products 表prod_idprod_nameprod_pricea0011egg3a0019sockets4b0019coffee15【问题】编写 SQL 语句,返回 Products 表中所有价格在 3 美元到 6 美元之间的产品的名称(prod_name)和价格(prod_price),…...

vue+elementUI 实现设置还款日字母弹窗组件
1、业务背景 还款业务,设置每月还款日,选每月几号扣款,不需要29、30、31,因为不是每个月都有这三天的 2、预期效果图 3、代码实现 3.1 初始化vue项目 地址:https://cn.vuejs.org/guide/introduction.html 3.2 在项…...

【JavaGuide面试总结】Redis篇·中
【JavaGuide面试总结】Redis篇中1.Redis 单线程模型了解吗?2.Redis6.0 之后为何引入了多线程?3.Redis 是如何判断数据是否过期的呢?4.过期的数据的删除策略了解么?5.Redis 内存淘汰机制了解么?6.什么是 RDB 持久化&…...
Python:每日一题之全球变暖(BFS连通性判断)
题目描述 你有一张某海域 NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿…...

VUE -- defineExpose
defineExpose定义demo定义 defineExpose定义:用于组件通信中父级组件调用操作子组建方法和响应式属性参数能力 在使用definExpose前需要了解两个拷贝对象函数 对象copy:shallowReactive 与 数据 copy:shallowRef 这两个都是vue包里面的 简…...

实用调试技巧【下篇】
🔴本文章是在 Visual Studio 2022(VS2022)编译环境下进行操作讲解 文章目录3.2.调试的时候查看程序当前信息3.2.1.查看临时变量的值3.2.2.查看内存信息3.2.3.查看调用堆栈3.2.4.查看汇编信息🥳4.调试实例🥳5.如何写出&…...

【数据结构期末例题】
前言 本文是博主自己在准备学校数据结构考试时的总结,各个知识点都贴有对应的详细讲解文章以供大家参考;当然文中还有许许多多的截图,这些是博主对主要内容的摘取,对于那些基础较好的同学可以直接看截图,减少跳转对应文…...
管理物理和快照备数据库(Physical and Snapshot Standby Databases)
1.打开物理备数据库 物理备数据库可以打开做只读访问,用于从主数据库卸载查询负载。 如果已经购买Oracle Active Data Guard选项的授权,当数据库打开时Redo Apply可以是激活的,因此允许查询返回与从主数据库返回的完全相同的结果…...

双目立体视觉:SAD算法
算法原理SAD(Sum of absolute differences)是一种图像匹配算法。基本思想:差的绝对值之和。此算法常用于图像块匹配,将每个像素对应数值之差的绝对值求和,据此评估两个图像块的相似度。该算法快速、但并不精确,通常用于多级处理的…...

海外问卷调查答题技巧,纯干货分享,新手小白看过来
海外问卷调查为什么别人赚得盆满钵满而我却连通过都不行?是不是经常有人发出这种疑问,东哥作为一个结交过很多做问卷调查行业的跨境人士,也了解到很多做这一行的去答题的时候都是掌握一定技巧的,而不是去乱答。今天东哥就来说说国…...

【NGINX入门指北】Nginx Web 架构实验
Nginx Web 架构实验 文章目录Nginx Web 架构实验一、动态网站结构二、LNMP 动态网站环境部署三、fastcgi & php-fpm:四、php-fpm初始化配置五、Nginx Location、六、Nginx Rewrite七、CA&HTTPS八、Nginx 的平滑升级一、动态网站结构 资源 资源文件识别——…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...