make的用法收集

深入解析configure/make/make install构建原理 在 Unix/Linux 及嵌入式开发中,源码构建流程本质上是解决跨平台适配与可重复编译的工程问题。其核心围绕平台探测、构建描述生成和安装行为抽象三大机制展开:通过动态运行测试识别目标系统能力(如交叉编译器支持、系统头文件与库函数可用性),生成定制化 Makefile 实现确定性编译;再经由标准化安装路径策略(prefix/DESTDIR)完成部署分发。该范式支撑了 Buildroot、Yocto 等主流嵌入式构建系统,并为 CMake、Meson 提供设计范本。理解 configure 的 Shell 探 阅读详情
# default

cd $FWPATH

touch conf_general.h   #用touch来更新文件时间戳,make是以文件时间戳来判断文件是否有更新的。有更新 
                       #就会执行编译。

make -j8 build_args='-DHW_SOURCE=\"hw_46.c\" -DHW_HEADER=\"hw_46.h\"'   #这里演示了如何在编译 
                                                  #选项里添加宏定义,其中\"是为了转义"符号。
                                 #j选项的含义为Specifies the number of jobs (commands) to 
                                 #run simultaneously
cd $DIR

cp $FWPATH/build/BLDC_4_ChibiOS.bin $COPYDIR/VESC_default.bin

# Object files groups

ACOBJS    = $(addprefix $(OBJDIR)/, $(notdir $(ACSRC:.c=.o)))

ACPPOBJS  = $(addprefix $(OBJDIR)/, $(notdir $(ACPPSRC:.cpp=.o)))

TCOBJS    = $(addprefix $(OBJDIR)/, $(notdir $(TCSRC:.c=.o)))

TCPPOBJS  = $(addprefix $(OBJDIR)/, $(notdir $(TCPPSRC:.cpp=.o)))

ASMOBJS   = $(addprefix $(OBJDIR)/, $(notdir $(ASMSRC:.s=.o)))

ASMXOBJS  = $(addprefix $(OBJDIR)/, $(notdir $(ASMXSRC:.S=.o)))

OBJS	  = $(ASMXOBJS) $(ASMOBJS) $(ACOBJS) $(TCOBJS) $(ACPPOBJS) $(TCPPOBJS)

#将C/C++源文件和汇编源文件的名称替换成目标文件的名称并添加相应的前缀(即头文件存放的位置)。
# notdir : 去除路径
	mkdir -p $(OBJDIR)

	mkdir -p $(LSTDIR)

#在makefile文件里执行建立文件夹的命令
# Paths

IINCDIR   = $(patsubst %,-I%,$(INCDIR) $(DINCDIR) $(UINCDIR))

LLIBDIR   = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))

#在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o,
#或者可以使用
#obj=$(dir:%.c=%.o)
#效果也是一样的。
#这里实现了在头文件路径上添加了-I

$(ACPPOBJS) : $(OBJDIR)/%.o : %.cpp Makefile

ifeq ($(USE_VERBOSE_COMPILE),yes)

	@echo

	$(CPPC) -c $(CPPFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@

else

	@echo Compiling $(<F)

	@$(CPPC) -c $(CPPFLAGS) $(AOPT) -I. $(IINCDIR) $< -o $@

endif

# $@ 表示目标文件
# $^ 表示所有依赖文件
# $< 表示第一个依赖文件

# @echo 为打印信息命令,加了@后打印时不会显示echo
Unix/Linux shell脚本中 “set -e” 的作用

#每个脚本都应该在文件开头加上set -e,这句语句告诉bash如果任何语句的执行结果不是true则应该退出。这样的好处是防止错误像滚雪球般变大导致一个致命的错误,而这些错误本应该在之前就被处理掉。

:=   # 即时变量
=    # 延时变量
?=   # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句

例如:

D = 123

D ?= ABC #此时这句不起作用,因为前面已经定义了D。
+=   # 附加, 它是即时变量还是延时变量取决于前面的定义

参考:makefile各种赋值(?= := = +=)_sophia__yu的博客-优快云博客_makefile 赋值

Makefile函数
a. $(foreach var,list,text)
b. $(filter pattern...,text)      # 在text中取出符合patten格式的值
   $(filter-out pattern...,text)  # 在text中取出不符合patten格式的值

c. $(wildcard pattern)            # pattern定义了文件名的格式, 
                                  # wildcard取出其中存在的文件
d. $(patsubst pattern,replacement,$(var))  # 从列表中取出每一个值
                                           # 如果符合pattern
                                           # 则替换为replacement

C文件中包含的头文件如果像#include <stdio.h>使用尖括号则编译器先会在gcc的文件夹和gcc添加的-I选项的头文件路径中去寻找。

-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
#“有些命令会在开头加一个’-‘,作用是发生错误时Makefile继续”

Linux系统预留可三个文件描述符:0、1和2,他们的意义如下所示:

0——标准输入(stdin)

1——标准输出(stdout)

2——标准错误(stderr)

2>/dev/null的意思就是将标准错误stderr删掉

参考:Shell中 2>/dev/null_summerlion的博客-优快云博客_>/dev/null

对于在include前为什么加了减号,参考下面链接

make/makefile中的加号+,减号-和at号@的含义 - 海王 - 博客园​​​​​​​

关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2,机器人学等机器人行业常用技术资料。

Linux软件构建三剑客:configure/make/make install详解 在Unix/Linux系统开发中,软件构建是项目开发的关键环节。configure/make/make install作为经典的构建工具链,通过自动化检测系统环境和生成平台适配的Makefile,实现了跨平台编译的标准化。其核心原理包括环境检测、依赖管理和并行编译等技术,广泛应用于C/C++项目的构建过程。特别是在开源软件领域,这套工具链配合Autotools(autoconf/automake)可以高效处理多平台兼容性问题。从工程实践角度看,开发者通过编写configure.ac和Makefile.am定 阅读详情

相关推荐

信息安全:信息收集之:被动信息收集

信息收集之:被动信息收集1 被动信息收集:OSINT1.1 获取情报的公开渠道1.2 信息收集内容1.3 信息用途2 DNS 信息收集2.1 nslookup2.2 dig2.3 递归查询与迭代查询2.4 DNS 区域传输2.5 DNS 字典爆破2.5.1 fierce2.5.2 dnsenmu2.5.3 dnsrecon2.6 DNS 注册信息2.6.1 whois3 搜索引擎3.1 搜索联网的设备3.1.1 SHODAN3.1.2 fofa3.2 GOOGLE 搜索3.2.1 高级搜索:3.2.2 GO

f_carey的博客 4470

make命令

代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。 1、一个简单 makefile例子 Make这个词,英语的意思是"制作"。Make命令直接用了这个意思,就是要做出某个文件。比如,要做出文件a.txt,就可以通过以下步骤实现: 1)书写规则,...

alex1801 1万+

内核模块make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules

模块一般用来支持那些不经常使用的功能。例如,通常情况下你仅使用拨号网络,因此网络功能并不是任何时候都需要的,那么就应该使用可装入的模块来提供这个功能。仅在你进行拨号联接的时候,该模块才被装入。而在你断掉连接的时候它会被自动卸下。这样会使内核使用内存的量最小,减小系统的负荷。 当然,那些象硬盘访问这样时时刻刻都需要的功能,则必须作在内核里。如果你搭一台网络工作站或 web服务器,那么网络功能是时刻都需要的,你就应该考虑把网络功能编译到内核里。另外一个方法是在启动的时候就装入网络模块。这种方法的优点是你不需要重新编译内核。而缺点是网络功能不能特别高效。 按照以上的原则,我们首先列出一张清单,看看 kernel 中哪些选项是非有不可的,也就是说,这些东西是必须被编译到内核中的。将那些非必需的模块剔除到内核以外。 第一个是root所在的硬盘配置。 哪果您的硬盘是IDE接口,就把 ide 的选项标记下来。如果是SCSI接口,请把您的接口参数及 SCSI id 记标下来。 第二个是选择使用哪一个文件系统。 Linux的默认文件系统是是 ext2 ,那么就一定要把它标记下来。如果机器中还其它的操作系统,如win98或windows NT,您还会可能选择FAT32或NTFS的支持,不过后面你可以通过手工加载的方式来加入新的模块支持。 第三个是选择Linux所支持的可执行文件格式。这里有两种格式可供选择: elf:这是当前Linux普遍支持的可执行文件格式,必须编译到内核中 。 a.out: 这是旧版的Linux的可执行文件各函数库的格式,如果你确认肯定用不到这种格式的可执行文件,那么就可以不把它编译到内核当中。 以上这些内容,是必须要编译到内核中的。其它的内容凡是所有选项中m提示的,都选择m,这样可以通过手工的方式添加该模块。 ** Loadable module support*Enable loadable module support (CONFIG_MODULES) [Y/n/?]Set version information on all symbols for modules (CONFIG_MODVERSIONS) [N/y/?]Kernel daemon support (e.g. autoload of modules) (CONFIG_KERNELD) [Y/n/?] 分别回答 Y,N,Y 。其中 CONFIG_KERNELD 的 default 值是 N, 所以要注意选择Y。 make config 完后,仍旧是 make dep; make clean。 接下来要 make zlilo 或 make zImage。 然后 make modules ; make modules_install 。完成之后,就编译出一个没有调入多余模块的一个“干净的”内核映像文件了。

嵌套makefile(下)

主要带大家走一遍makefile在实际运用中的流程

m0_59700590的博客 649

STM32F407 CanOpen主机实战:对象字典配置与多电机CIA402协议驱动详解

本文详细介绍了基于STM32F407的CanOpen主机开发实战,重点解析了对象字典的配置流程与多电机CIA402协议驱动方法。通过使用objdictedit工具配置SDO和PDO参数,并整合CanFestival协议栈,实现了对多个伺服电机的稳定同步控制。文章提供了从硬件连接到代码调试的完整指南,帮助开发者快速掌握工业现场的多轴运动控制技术。

plant的博客 534

Calibre LVS错误排查实战:从Innovus到GDS的完整调试流程(附常见错误解析)

本文详细介绍了数字IC后端设计中,从Innovus工具输出数据到Calibre LVS物理验证的完整调试流程。文章系统性地讲解了LVS错误排查的方法论,包括报告解读、图形化定位以及针对器件不匹配、电源网络错误、短路开路等常见问题的深度解析与解决方案,旨在帮助工程师高效完成版图与原理图的一致性检查。

weixin_29218963的博客 777

多目录工程的makefile书写示例

关于程序的编译和链接 —————————— 在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成运行文件,这个动作叫作链接(link)。 编译时,编译器须要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你须要告诉编译器头文件的所在位置(头文件里应该仅仅是声明,

shirinngunn的博客 727

区块链入门:用账本、乐高和三台旧电脑讲懂分布式账本

区块链是一种去中心化的分布式账本技术,其核心原理是通过密码学哈希、共识机制和链式结构实现数据不可篡改与多方共同验证。它不依赖单一中心,而是将交易记录同步复制到多个节点,依靠数学规则而非人工信任达成一致,从而在数字世界构建可验证的信用基础设施。这种‘集体见证’模式显著提升了系统抗单点故障与人为干预的能力,广泛应用于供应链溯源、数字身份、教育管理及公益透明等需强信任保障的场景。本文以账本类比、乐高拆解和Ganache实操为线索,面向零基础读者通俗解析哈希值、挖矿与智能合约等关键概念。

weixin_30517215的博客 276

对linux编译模块make -C path_to_kernel_src M=`pwd` modules的理解

这篇文章侧重点在M=`pwd`的个人理解,不足之处希望大神斧正,谢谢。     一直以为M=`pwd`是make的参数,可是这个参数也写的够简单。最近重看时,发现常有这样的makefile内容 # Use 'make V=1' to see the full commands ifdef V ifeq ("$(origin V)", "command line") KBUILD_VERBOSE

lixiangminghate的专栏 6428

ML307A模组连接ONENET平台(AT指令步骤教程)

ML307A 是一款集成度高、体积小的物联网通信模组,支持多种无线通信协议,如 LoRa、NB-IoT 等。它具有低功耗、远程通信等特点,适用于多种物联网场景。支持 LoRa 和 NB-IoT 等多种无线通信标准。提供丰富的 GPIO 接口。内置多种传感器支持。UART 接口:用于与微控制器或其他设备通信。GPIO 接口:可以连接外部传感器或执行器。电源接口:用于供电。OneNET 是中国移动推出的一款物联网开放平台,它提供了从数据采集、存储到分析的一站式解决方案。

xiewengeng的博客 5484

GDI文字绘制和windows下opengl文字绘制小结

GDI绘制文字,要设置文字的属性,主要就是通过设置DC中的font对象来实现的。 font对象的创建可以由createfont()、createfontIndirect()来实现。 HFONT CreateFont( int nHeight, // height of font int nWidth, // average

T_W_S的专栏 5323

Makefile、多Makefile编译静态库、动态库、SRC实例总结

静态库生成及使用 calc.h #ifndef __MY_LIB_H__ #define __MY_LIB_H__ int add(int a, int b); #endif calc.c #include "calc.h" #include <stdio.h> int sum(int i, int j) { return (i+j); } 编译: ...

墨痕诉清风的博客 2879

电池管理系统(BMS)软件:CATL BMS二次开发_(1).CATL BMS软件概述

CATL BMS软件的保护机制是确保电池组安全和可靠运行的关键部分。通过高精度的传感器和智能算法,BMS可以实时监测电池组的状态,及时采取保护措施。二次开发中,可以根据特定的应用需求,增加新的传感器、优化算法、扩展通信接口等,进一步提高系统的性能和可靠性。维护和扩展则是确保系统长期稳定运行的重要手段。希望以上内容对您理解CATL BMS软件的保护机制有所帮助。如果您有任何进一步的问题或需要更详细的解释,欢迎随时提问。

zhubeibei168的博客 1460

HelloGitHub Vol.09 月刊精读:19 个入门级开源项目分类实战指南

本期导读:HelloGitHub 第 9 期(Vol.09)英文月刊精选了 19 个来自 GitHub 的有趣、入门级开源项目,覆盖 C++、Go、Java、JavaScript、PHP、Python、Swift、AI 及书籍等多个方向。本文将带你逐项读懂这 19 个项目各自解决什么问题、如何快速上手,并对其中最具实操价值的 flask-limiter 限流示例与 ngrok 内网穿透命令做源码级

gitblog_00597的博客 345

OpenClaw Docker 安装与部署教程,环境隔离不冲突技术指南

本文介绍了使用Docker容器化部署OpenClaw的完整教程。首先通过流程图详细说明了Docker环境检测流程,包括系统支持性检查、Docker安装状态验证、版本检测和服务配置等步骤。然后提供了Windows、macOS和Linux(Ubuntu/CentOS)系统下的Docker安装指南,涵盖从下载、安装到权限配置的全过程。最后介绍了OpenClaw官方镜像的拉取方法以及自定义镜像构建的Dockerfile示例。该教程适用于开发和生产环境,利用Docker实现环境隔离和快速部署。

一键难忘的博客 991

RK3588部署YOLO模型 包含模型量化+npu轻量化+ubuntu+RGA图像加速和多线程模型加速 包源码

本专栏为深度学习部署全栈学习体系,包含68篇由浅入深的教程,专为零基础学习者设计。内容涵盖TensorRT与RK3588平台部署技术,包含Jetson系列和RK系列硬件部署实战,采用"理论+源码+实战"三位一体的教学模式。学习路径从基础环境搭建到模型优化、容器化部署、多硬件平台适配,最终掌握工业级AI部署能力。特色包括C++基础教学、Docker容器化、INT8量化、多线程优化等核心技术,并附带YOLOv5、人脸检测、车牌识别等多个实战项目源码。适合算法工程师转部署方向、嵌入式开发者及对

FJN110的博客 3732

Makefile构建实战:从基础语法到多目录工程组织与排错

在软件开发中,构建是连接源码与可执行程序的桥梁,而自动化构建工具则是提升工程效率的关键。增量编译机制通过文件时间戳与依赖关系,只重新编译发生变更的部分,避免全量编译带来的时间浪费。Makefile作为Linux环境下最经典的构建脚本,以其灵活的目标-依赖-规则模型,成为C/C++项目工程化的核心工具。无论是嵌入式开发还是后端服务,掌握Makefile都能让开发者更从容地管理多文件、多目录的复杂项目。本文从基础语法出发,逐步讲解变量、自动变量、wildcard文件收集、多目录组织、自动头文件依赖生成等关键技巧

weixin_30096975的博客 61

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

make命令OPTIONS总览表 GNU make

make命令OPTIONS总览表 GNU make make版本: GNU Make 4.3 注意:按字典顺序 -b, -m 忽略和其它版本make的兼容性,也就是说当前版本的make不兼容之前版本的make -B, --always-make 认为所有的目标都需要更新(重编译),无条件执行规则 -C dir, --directory=dir 读取makefile前,先切换到指定目录dir,如果多次使用-C参数,每个-C选项的路径都相对于前一个选项 如make -C /HOME -C src

qq_39366020的博客 1184

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

make help收集

用法:make [选项] [目标] ... 选项: -b, -m 忽略兼容性。 -B, --always-make 无条件 make 所有目标。 -C DIRECTORY, --directory=DIRECTORY 在执行前先切换到 DIRECTORY 目录。

路漫漫其修远兮 2013

make 概述

make 概述

xie__jin__cheng的博客 1535

make日志同时输出到控制台和文件及2」&1

0标准输入stdin = standard input 1标准输出stdout = standard output 2标准错误输出stderr = standard error make 2>&1 |tee ./a.txt 这句命令是先将标准错误输出重定向到标准输出,然后将标准输出用 "|"定向到标准输入,然后用tee命令从标准输入读取,存到文件。 ========================================================...

jingzitakk66的专栏 3962

机器学习流程—数据收集

数据可以采用各种形式,例如数值、分类或时间序列数据,并且可以来自各种来源,例如数据库、电子表格或 API。机器学习算法使用数据来学习输入变量和目标输出之间的模式和关系,然后可用于预测或分类任务。标记数据未标记数据标记数据包含模型尝试预测的标签或目标变量,而未标记数据不包含标签或目标变量。机器学习中使用的数据通常是数字或分类的。数值数据包括可以排序和测量的值,例如年龄或收入。分类数据包括代表类别的值,例如性别或水果类型。数据可以分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。

2401_84052244的博客 4332

kernel——make menuconfig的实现原理

系统移植可以分为

hpr1992的专栏 8405

make命令多线程编译_make 多线程

为了做好运维面试路上的助攻手,特整理了上百道。

2401_83947105的博客 1453

make, cmake, bazel

整理收集了一些自动化编译链接工具的使用教程, 希望可以在之后能更好的理解和使用它们!1. make Linux 下 Make 命令 Linux ‘make’ Command Explained With Examples 使用make命令编译项目文件入门 gcc和make的区别 2. cmake…3. bazel Bazel入门 Bazel入门教程(C++ project) Bazel C++

_icrazy_的博客 4723

make命令和makefile文件

由于make命令在执行规则时会调用一个shell,并且会针对每个规则使用一个新的shell,所以必须在上面每行代码的结尾加上一个反斜杠\,让所有的shell脚本命令在逻辑上处于同一行,并作为一个整体传递给一个shell执行。用于制作目标clean的规划并未给目标clean定义任何依赖关系,行clean:的后面是空的,所以在执行make命令时,如果指定目标clean,则该目标所对应的规则将总被执行。的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>;一般来说,目标是一个单独的可执行文件。

quxiantao的专栏 174
上一篇: 使用gcc编译STM32遇到的问题
下一篇: gcc的使用
首飞爱玩机器人
博客等级 码龄14年 6990粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值