Makefile介绍与使用

news2024/11/22 1:51:37

Make简介

工程管理器,顾名思义,是指管理较多的文件
Make工程管理器也就是个“”自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同事,它通过读入Makefile文件的内容来执行大量的编译工作
Make将只编译改动的代码文件,而不用完全编译

Makefile基本结构

Makefile是Make读入的唯一配置文件
  • 由make工具创建的目标体(target),通常是目标文件或可执行文件
  • 要创建的目标体所依赖文件(dependency_file)
  • 要创建每个目标体时需要运行的命令(command)
注意:命令行前面必须是一个“TAB”键,否则编译错误为:***missing separator.Stop
Makefile格式
	target : dependency_files
	<TAB> command
	
	hello.o : hello.c hello.h
		gcc -c hello.c -o hello.o
例子

hello.c

#include <stdio.h>

void func(void)
{
	printf("hello\n");
}

hello.h

void func(void);

main.c

#include <stdio.h>
#include "hello.h"

int main(int argc, char **argv)
{
	func();
	return 0;
}

Makefile

test:hello.o main.o
	gcc hello.o main.o -o test
hello.o:hello.c
	gcc -c hello.c -o hello.o
main.o:main.c
	gcc -c main.c -o main.o
.PHONY:clean
clean:
	rm *.o test

在这里插入图片描述

创建和使用变量

创建变量的目的:用来代替一个字符文本字符串:

  1. 系列文件的名字
  2. 传递给编译器的参数
  3. 需要运行的程序
  4. 需要查找源代码的目录
  5. 你需要输出信息的目录
  6. 你想要做的其它事情

变量定义的两种方式

  • 递归展开的方式VAR=var
  • 简单方式 VAR:=var

变量使用$(VAR)

用“ ”和“ ” 和 “ $”来表示

类似于编程语言中的宏

eg:

OBJS = kang.o yul.o
CC = gcc
CFLAGS = -Wall -O -g
sunq: $(OBJS)
	$(CC) $(OBJS) -o sunq.o
kang.o: kang.c kang.h
	$(CC) $(CFLAGS) -c kang.c -o hang.o
yul.o: yul.c yul.h
	$(CC) $(CFLAGS) -c yul.c -o yul.o

将上面的例子修改后:

OBJS = hello.o main.o
CC = gcc
CFLAGS = -Wall -O -g

test:$(OBJS)
        $(CC) $(OBJS) -o test
hello.o:hello.c
        $(CC) $(CFLAGS) -c hello.c -o hello.o
main.o:main.c
        $(CC) $(CFLAGS) -c main.c -o main.o
.PHONY:clean
clean:
        rm *.o test

简单方式 VAR: =var

m:=mm

x:=$(m)
y:=$(x)bar
x:=late

echo $(x) $(y)

用?=定义变量

dir:=/foo/bar
FOO?=bar

含义是,如果FOO没有被定义过,那么变量FOO的值就是"bar",如果FOO先前被定义过,那么这条语句将什么也不做,其等价于:

ifeq ($(origin FOO),undefined)
	FOO = bar
endif

为变量添加值

你可以通过+=为已定义的变量添加新的值

Main=hello.o hello-1.o
Main+=hello-2.o
预定义变量
  • AR:库文件维护程序的名称,默认值为ar。AS汇编程序的名称,默认值为as
  • CC:C编译器的名称,默认为cc。CPP C预编译期的名称,默认值为$(CC) -E。
  • CXX: C++编译器的名称,默认值为g++。
  • FC:FORTRAN编译器的名称,默认值为f77
  • RM:文件删除程序的名称,默认值为 rm -r

eg:

Hello: main.c main.h
	$(CC) -o hello main.c
clean:
	$(RM) hello

自动变量

  • $* 不包含扩展名的目标文件名称
  • $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能 包含重复的依赖文件
  • $< 第一个依赖文件的名称
  • $? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
  • $@ 目标文件的完整名称
  • $^ 所有不重复的目标依赖文件,以空格分开
  • $% 如果目标是归档成员,则该变量表示目标的归档成员名称

修改后例子:

OBJS = hello.o main.o
CC = gcc
CFLAGS = -Wall -O -g

test: $(OBJS)
        $(CC) $(OBJS) -o $@
hello.o: hello.c
        $(CC) $(CFLAGS) -c $< -o hello.o
main.o: main.c
        $(CC) $(CFLAGS) -c $^ -o main.o
.PHONY: clean
clean:
        rm *.o test

Make使用

直接运行make
选项

  • -C dir读入指定目录下的Makefile
  • -f file读入当前目录下的file文件作为Makefile
  • -i忽略所有的命令执行错误
  • -I dir指定被包含的Makefile所在目录
  • -n只打印要执行的命令,但不执行这些命令
  • -p显示make变量数据库和隐含规则
  • -s在执行命令时不显示命令
  • -w如果make在执行过程中改变目录,打印当前目录名

Makefile的VPATH

VPATH : 虚路径
在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。所以,当make需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。
Makefile文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。
VPATH = src:…/headers
上面的的定义指定两个目录,“src”和“…/headers”,make会按照这个顺序进行搜索。目录由“冒号”分隔。(当然,当前目录永远是最高优先搜索的地方)

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

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

相关文章

问道管理:市场热点有望轮动表现 关注数据要素等主题板块

近期两市指数继续单边下行趋势仍未扭转&#xff0c;短期利好后指数虽有反弹&#xff0c;但上方仍然压力重重&#xff0c;短期或仍然以反复筑底为主。因而&#xff0c;在国内根本面仍未强势复苏前&#xff0c;指数技能面上仍然会有限制&#xff0c;短期反弹修正后或仍有反复&…

RNN循环神经网络

目录 一、卷积核与循环核 二、循环核 1.循环核引入 2.循环核&#xff1a;循环核按时间步展开。 3.循环计算层&#xff1a;向输出方向生长。 4.TF描述循环计算层 三、TF描述循环计算 四、RNN使用案例 1.数据集准备 2.Sequential中RNN 3.存储模型&#xff0c;acc和lose…

MAC M2芯片执行yolov8 + deepsort 实现目标跟踪

MAC M2芯片执行yolov8 deepsort 实现目标跟踪 MAC M2 YoloX bytetrack实现目标跟踪 实验结果 MAC mps显存太小了跑不动 还是得用服务器跑 需要实验室的服务器跑 因为网上花钱跑4天太贵了&#xff01;&#xff01;&#xff01; 步骤过程尝试&#xff1a; 执行mot17 数据集 …

FSPI的PCB设计

FSPI是一种灵活的串行接口控制器&#xff0c;RK3588芯片中有1个FSPI控制器&#xff0c;可用来连接FSPI设备。 RK3588 FSPI 控制器有如下特点&#xff1a; 1&#xff09;支持串行NOR Flash&#xff0c;串行Nand Flash&#xff1b; 2&#xff09;支持SDR模式&#xff1b; 3&am…

Android屏幕显示 android:screenOrientation configChanges 处理配置变更 代码中动态切换横竖屏

显示相关 屏幕朝向 https://developer.android.com/reference/android/content/res/Configuration.html#orientation 具体区别如下&#xff1a; activity.getResources().getConfiguration().orientation获取的是当前设备的实际屏幕方向值&#xff0c;可以动态地根据设备的旋…

【STM32】学习笔记(EXTI)-江科大

EXTI外部中断 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行 中断优先级&#x…

【Python数据分析】数据分析之numpy基础

实验环境&#xff1a;建立在Python3的基础之上 numpy提供了一种数据类型&#xff0c;提供了数据分析的运算基础&#xff0c;安装方式 pip install numpy导入numpy到python项目 import numpy as np本文以案例的方式展示numpy的基本语法&#xff0c;没有介绍语法的细枝末节&am…

电商数仓项目需求及架构设计

一、项目需求 1.用户行为数据采集平台搭建 2.业务数据采集平台搭建 3.数仓维度建模 4.统计指标 5.即席查询工具&#xff0c;随时进行指标分析 6.对集群性能进行监控&#xff0c;发生异常时报警&#xff08;第三方信息&#xff09; 7.元数据管理 8.质量监控 9.权限管理&#xff…

streamlit-API

介绍 安装 pip install streamlit运行 streamlit run your_script.py [-- script args]数据流 多页应用程序 API 文本元素 数据元素 图标元素 输入小部件 媒体元素 布局和容器 聊天元素 st.chat_message st.chat_input 显示进度和状态 控制流 占位符/帮助/选项 图表改变 会…

SpringBoot工具类—基于定时器完成文件清理功能

直接复制粘贴既可&#xff01;&#xff01; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.File; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOff…

云职达(上海)岗前实训基地(上海云职达):致力为企业提供良好的数字化解决方案

上海云职达全称&#xff1a;云职达上海信息科技有限公司&#xff0c;是一家致力于推动算力产业发展的企业。随着数字经济时代的到来&#xff0c;算力作为数字产业化和产业数字化转型的关键支撑&#xff0c;已经成为推进中国式现代化的重要驱动力量。云职达深入理解算力产业的重…

星辰天合荣获“2023年度优秀光伏行业数字化供应商”

8 月 28 日&#xff0c;由 OFweek 维科网及旗下权威的光伏专业媒体-维科网光伏共同举办的“OFweek 2023&#xff08;第十四届&#xff09;太阳能光伏产业大会暨光伏行业年度颁奖典礼”在深圳成功举办。 星辰天合凭借在光伏领域的优秀智能存储解决方案&#xff0c;以及大量的应用…

Rdedis 持久化

Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&#xff0c;那么一旦服务器进程退出&#xff0c;服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能&#xff01; 一、RDB&#xff08;Redis DataBase&#xff09; 1.1 概念 在指定的时间间隔内…

冠达管理:2023股票交易新规则详解?股票手续费包括哪些?

投资者进行股票投资时不是随便就可以进行生意的&#xff0c;需求恪守一定的生意规则&#xff0c;才干顺利成交。那么2023股票生意新规则详解&#xff1f;股票手续费包含哪些&#xff1f;下面就由冠达管理为大家分析&#xff1a; ​ 2023股票生意新规则详解&#xff1f; 1、约…

EDFHG-04-200-3C2-XY-31T001电液比例大流量调速阀放大器

EDFHG-03-100-3C40-XY-30T、EDFHG-03-100-3C2-XY-30T、EDFHG-04-140-3C40-XY-30T、EDFHG-04-140-3C2-XY-30T、EDFHG-06-140-3C40-XY-30T、EDFHG-06-140-3C2-XY-30T、EDFHG-04-200-3C2-XY-31T001、EDFHG-06-400-3C2-XY-31T001、EDFHG-06-400-3C40-XY-31T001电液比例换向调速阀采…

vue3 ref reactive响应式数据 赋值的问题

文章目录 vue3 ref reactive响应式数据 赋值的问题场景1:将响应式数据赋值请求后的数据错误示范&#xff1a;直接赋值正确写法 场景2&#xff1a;响应式数据解构之后失去响应式原因分析解决办法 toRefs/toRef方法创建ref引用对象 vue3 ref reactive响应式数据 赋值的问题 doing…

云备份——项目介绍

一&#xff0c;项目基本介绍 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。并且能够随时通过浏览器进行查看并且下载&#xff0c;其中下载过程支持断点续传功能&#xff0c;而服务器也会对上传文件进行热点管理&#xff0c;将非热点文件进行压缩存储&…

在springboot中配置mybatis(mybatis-plus)mapper.xml扫描路径的问题

我曾经遇到过类似问题&#xff1a; mybatis-plus的mapper.xml在src/main/java路径下如何配置pom.xml和application.yml_idea 把mapper文件放到java下如何配置_梓沂的博客-CSDN博客 当时只是找到解决问题的办法&#xff0c;但对mybatis配置来龙去脉并未深入了解&#xff0c;所…

无意间发现这款可以免费制作3D翻页电子画册的网站

在博主努力的搜寻下&#xff0c;无意间发现这个网站&#xff0c;可以免费制作3D翻页电子画册。使用这个网站非常简单&#xff0c;只需上传你想要展示的图片和添加相应的文字&#xff0c;然后选择合适的模板和风格。接下来&#xff0c;就会自动转化成漂亮的3D翻页画册 工具嘛&am…

《安富莱嵌入式周报》第321期:开源12导联便携心电仪,PCB AI设计,150M示波器差分探头,谷歌全栈环境IDX,微软在Excel推出Python

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1ju4y1D7A8/ 《安富莱嵌入式周报》第321期&#xff1a;开源12导…