Makefile实战论(一)

为什么写这个呢,其实我有系统学过Makefile和CMake。但是因为用的不是很多或者说没有深入的使用场景,导致我不是很熟练,或者说没法优雅地使用。刚好最近对Linux的嵌入式编程比较感兴趣,借着demo来分析一下资深工程师写的Makefile,学习一下。由易到难吧,先来第一个,是一个GPIO的Makefile。

Makefile文件

BIN = test_gpio  
CC = $(CROSS)gcc  
CPP = $(CROSS)g++  
LD = $(CROSS)ld  
#
INCS = 
LIBS =  
SUBDIRS =  
#
DEFINC = -I ./ \# LIBVAR =-shared -fPIE -L.
#
INCS += $(DEFINC)  
LIBS +=$(LIBVAR)
#  
CSRCS = $(wildcard *.c)  
CPPSRCS = $(wildcard *.cpp)  
#  
COBJS := $(CSRCS:.c=.o)  
CPPOBJS := $(CPPSRCS:.cpp=.o)  
#  
CFLAGS += $(INCS)  
CFLAGS += -O2 -Wall -g -fPIE
CPPFLAGS += $(INCS)  
CPPFLAGS += -O2 -Wall -g -fPIE
LDFLAGS += -lm -lrt -lstdc++ -ldlall:$(BIN)  
$(COBJS) : %.o: %.c  $(CC) $(CFLAGS) -c $< -o $@   
$(CPPOBJS) : %.o: %.cpp  $(CPP) $(CPPFLAGS) -c $< -o $@ $(BIN) : $(COBJS) $(CPPOBJS)  $(CC) -o $(BIN)    $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS)    rm -rf $(COBJS)  rm -rf $(CPPOBJS)  .PHONY:clean cleanall  clean:              rm  -rf $(BIN) $(COBJS) $(CPPOBJS)  
#rm *.d  
cleanall:  rm $(BIN) $(COBJS) $(CPPOBJS)  

拆解分析

BIN = gpio_red_blink
CC = $(CROSS)gcc
CPP = $(CROSS)g++
LD = $(CROSS)ld
  • 定义了变量BIN,表示生成可执行文件名为gpio_red_blink
  • 定义变量CC,表示使用的C编译器为$(CROSS)gcc(其中$(CROSS)是一个可能存在的前缀
  • 定义变量CPP,表示使用的C++编译器为$(CROSS)g++
  • 定义变量LD,表示使用的链接器为$(CROSS)ld
INCS =
LIBS =
SUBDIRS =
  • 定义空变量INCELIBSSUBDIRS
DEFINC = -I ./ \
  • 定义变量DEFINC,指定编译过程中需要包含的头文件路径。这里设置为当前路径
INCS += $(DEFINC)
LIBS +=$(LIBVAR)
  • DEFINC添加到INCS
  • 将未定义变量LIBVAR添加到LIBS
CSRCS = $(wildcard *.c)
CPPSRCS = $(wildcard *.cpp)
  • 使用通配符,将当前目录所有.c文件加入到CSRCS变量中
  • 使用通配符,将当前目录所有.cpp文件加入到CSRCS变量中
COBJS := $(CSRCS:.c=.o)
CPPOBJS := $(CPPSRCS:.cpp=.o)
  • CSRCS中所有.c文件扩展名替换为.o,并且赋值给COBJS
  • CPPSRCS中所有,cpp文件扩展名替换为.o,并且赋值给CPPOBJS
CFLAGS += $(INCS)
CFLAGS += -O2 -Wall -g -fPIE
CPPFLAGS += $(INCS)
CPPFLAGS += -O2 -Wall -g -fPIE
LDFLAGS += -lm -lrt -lstdc++ -ldl -lpthread
  • INCS分别添加到CFLAGSCPPFLAGS,指定了编译包含头文件路径
  • -O2 -Wall -g -fPIE添加到CFLAGSCPPFLAGS,表示编译选项
  • -lm -lrt -lstdc++ -ldl -lpthread,添加到LDFLAGS中,表示链接选项
all:$(BIN)
  • 定义了一个目标叫做all
  • 依赖于可执行文件$(BIN)
$(COBJS) : %.o: %.c$(CC) $(CFLAGS) -c $< -o $@
  • 定义了一个规则模式,将.c文件编译为.o文件
  • %表示通配符,任意字符
  • $<表示第一个依赖的文件,即.c文件
  • $@表示目标文件,即.o文件
$(CPPOBJS) : %.o: %.cpp$(CPP) $(CPPFLAGS) -c $< -o $@
  • 定义了一个规则模式,将.cpp文件编译为.o文件
$(BIN) : $(COBJS) $(CPPOBJS)$(CC) -o $(BIN)    $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS)rm -rf $(COBJS)rm -rf $(CPPOBJS)
  • 定义一个规则模式,用于链接目标文件生成可执行文件$(BIN)
  • $(BIN)依赖$(COBJS) $(CPPOBJS)
  • 链接完成后删除中间文件
.PHONY:clean cleanall
clean:rm  -rf $(BIN) $(COBJS) $(CPPOBJS)
cleanall:rm $(BIN) $(COBJS) $(CPPOBJS)
  • 定义两个伪目标(.PHONY),用于执行清理操作

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

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

相关文章

【Python】使用matplotlib绘制图形(曲线图、条形图、饼图等)

文章目录 一、什么是matplotlib二、matplotlib 支持的图形三、如何使用matplotlib1. 安装matplotlib2. 导入matplotlib.pyplot3. 准备数据4. 绘制图形5. 定制图形6. 显示或保存图形7. &#xff08;可选&#xff09;使用subplots创建多个子图注意事项&#xff1a; 四、常见图形使…

联盟学习:技术原理、特点及适用场景

一、引言 随着大数据和人工智能技术的快速发展&#xff0c;数据成为了推动科技进步的重要资源。然而&#xff0c;在实际应用中&#xff0c;数据往往呈现出碎片化、分散化的特点&#xff0c;如何有效地利用这些数据成为了业界关注的焦点。联盟学习&#xff08;Federated Learni…

880基础题查漏补缺

高等数学 函数极限连续 无穷大包括∞与-∞ 无穷小≠0 0无穷大0 有界函数无穷大不定 极限不存在极限不存在极限可能存在可能不存在 极限存在极限存在极限存在 等价无穷小替换的x可广义化&#xff0c;比如sin(ax2)~ax2 lim x n e x \dfrac{x^n}{e^x} exxn​时&#xff0c;e…

安卓逆向经典案例—H5appXX运维

H5app的class不一定是android.webkit.WebView 也可能是腾讯X5内核或者是uc webview 殊途同归也要去hook webview的系统函数和可调式方法setWebContentsDebuggingEnabled。突破sign算法&#xff0c;输出协议和加密算法的作用是什么&#xff1f;分析c-sign值 在加密的位置下断点 …

第三十七章 添加和使用自定义标题元素 - 自定义标头的继承

文章目录 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承自定义标头的继承示例 在 SOAPHEADERS 参数中指定支持的标头元素自定义标头的继承 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承 自定义标头的继承 如果创建此Web 服务的子类&#xff0c;该子类…

【vite】入门 publicDir 到高阶玩法

【vite】入门 publicDir 到高阶玩法 &#x1f4cc; 使用方式 &#x1f9e9; 默认选项 publicDir默认选项为字符"public"&#xff0c;表示静态资源默认指向public。 import { defineConfig } from vite export default defineConfig({publicDir: public })说明&am…

昇思25天学习打卡营第6天|使用静态图加速

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 背景介绍 AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介…

代码随想录——摆动序列(Leetcode376)

题目链接 贪心 class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length < 1){return nums.length;}// 当前一对差值int cur 0;// 前一对差值int pre 0;// 峰值个数int res 1;for(int i 0; i < nums.length - 1; i){cur nums[i 1] - nums[i];i…

黑苹果EFI详细配置说明

先上网址: https://dortania.github.io/OpenCore-Install-Guide/installer-guide/opencore-efi.html 1: 了解作用 ACPI作用: 总结: ACPI是UEFI引导方式和操作系统之间的硬件抽象接口,概述了硬件设备,如 USB 控制器、CPU 线程、嵌入式控制器、系统时钟等 硬件设备识别和驱动:…

深入理解Java中的线程池和并发编程

深入理解Java中的线程池和并发编程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我将带大家深入了解Java中的线程池和并发编程。线程池是并发…

似然 与 概率

概率似然概率函数与似然函数的关系似然与机器学习的关系最大似然估计 似然与概率分别是针对不同内容的估计和近似 概率 概率&#xff1a;概率表达给定参数 θ \theta θ下样本随机向量 X x \textbf{X} {x} Xx的可能性。 概率密度函数的定义形式是 f ( x ∣ θ ) f(x|\t…

基于RAG的知识库AI代理机器人,问题思考

基于RAG的知识库AI代理机器人,问题思考 知识库内容分类 对于普通非qa问答格式的知识内容 在分段存储时,需要手动调整,保证每个分段的内容意思完整,不被分割,当然段落也不宜过长,保证内容表达的意思到不可分割为止就行 对于qa问答格式的知识内容 通常需要对问题增加格…

Mac 安装依赖后依旧报错 ModuleNotFoundError: No module named ‘Crypto‘

ModuleNotFoundError: No module named ‘Crypto’ 解决办法 pip uninstall pycryptodome pip uninstall pycrypto pip uninstall crypto pip install pycrypto

头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)

文章目录 延迟任务精准发布文章1)文章定时发布2)延迟任务概述2.1)什么是延迟任务2.2)技术对比2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现 3)redis实现延迟任务4)延迟任务服务实现4.1)搭建heima-leadnews-schedule模块4.2)数据库准备4.3)安装redis4.4)项目集成…

智能BI项目技术点总结

上传文件的安全性设计 文件大小&#xff1a;小于20MB 文件后缀&#xff1a;是否满足.xlsx 文件内容&#xff1a;&#xff08;成本要高一些&#xff09; 文件的合规性&#xff1a;比如敏感内容&#xff0c;建议用第三方的审核功能。 扩展点&#xff1a;接入腾讯云的图片万象数据…

SVM算法-人脸识别背后技术详解

引言 支持向量机&#xff08;SVM&#xff09;是一种强大的监督学习算法&#xff0c;广泛应用于分类和回归任务中。本文将详细介绍SVM算法在人脸识别任务中的应用&#xff0c;并通过代码示例来展示其背后的技术精髓。我们将分三大部分来展开&#xff0c;本部分将重点介绍SVM算法…

3个阶段和9个问题,择业和创业的核心!

从2023年下半年&#xff0c;接触了不少的创业者&#xff0c;他们对创业都是充满了热情。在很多创业者身上&#xff0c;看到的都是执行力&#xff0c;效率&#xff0c;对事业的专注。只要是说今天立即能搞定的事情&#xff0c;一定不会拖到明天。 去年佛山的张兄弟来找我的交流…

Graalvm尝鲜使用

面试时遇到大佬提点了下在性能不足的机器上传统优化JVM调优已经作用不大的背景下&#xff0c;采用graalvm进行打包成二进制文件&#xff0c;脱离java虚拟机&#xff0c;性能提升20%到100%&#xff0c;因此实操记录下来&#xff0c;方便后续使用 1、前置预装 graalvm-ce-java17…

mongoDB基本命令操作

文章目录 1. 安装(1). 启动mongodb(2). 数据库连接 2. 基本命令(1) 数据库操作(2) 集合操作(3) 文档操作1) 简单查询2) 条件查询3) 投影查询4) 文档更新5) 列值增长修改6) 删除文档7) 分页查询8) 排序查询9) 正则查询(模糊查询)10) 比较查询11) 包含查询 3. 索引(1) 执行计划 1…

Java基础的重点知识-06-String、Arrays、Math、static关键字

文章目录 String类(java.lang)static关键字Arrays类(java.uitl)Math类&#xff08;java.lang&#xff09; String类(java.lang) java.lang.String 类代表字符串。 特征&#xff1a; 字符串不变&#xff1a;字符串的值在创建后不能被更改。因为String对象是不可变的&#xff…