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

项目集成过程中的makefile记录

项目集成过程中的makefile记录

文章目录

  • 项目集成过程中的makefile记录
    • 1.基础概念
      • 注释
      • 打印
      • 赋值方式
      • 常用变量
        • @
        • $
      • 伪目标
      • 函数
        • wildcard
      • 多目录、文件操作
    • 2.思路梳理
      • **需求分析**
      • 目录结构
    • 3.可行示例

持续更新中

1.基础概念

注释

#

示例:

# 项目名称

打印

 @echo "Hello, world!			#仅打印信息echo "Hello, world!			#打印命令和信息

赋值方式

=

使用 = 进行赋值时,变量的值是延迟展开的,即在使用变量时才进行展开计算。这意味着变量的值可以依赖于其他变量,也可能受后续赋值操作的影响。例如:SOURCES = $(wildcard src/*.c)
OBJS = $(SOURCES:.c=.o)

:=

:= 是 Makefile 中用于静态变量赋值的一种方式,它具有立即展开和避免递归展开的特点,适合用于定义不依赖于其他变量的静态值。

?=

使用 ?= 进行赋值时,如果变量之前未被赋过值(即为空),则进行赋值;如果变量已经有值,则不重新赋值。这种方式通常用于设置默认值,让用户可以在命令行或其他地方覆盖默认值。例如:CC ?= gcc

+=

使用 += 可以向变量追加新的值,而不是覆盖原有的值。这在需要动态追加值的情况下非常有用。例如:CFLAGS += -Wall -O2

常用变量

@

作用:

@ 符号通常用于控制命令的输出

示例和讲解:

print_message:@echo "Hello, world!
执行 make print_message 将只输出 Hello, world!,而不会额外显示命令本身。如果不带 @ 符号,Make 工具将会输出命令本身以及命令执行结果。print_message:echo "Hello, world!"
执行 make print_message 将输出 echo "Hello, world!" 以及 Hello, world!。总之,@ 符号可以控制命令的输出,让你可以选择是显示命令本身还是只显示命令执行结果。
$
1.变量引用:$ 后面跟着变量名可以引用该变量的值。
例如:$(CC)、$(CFLAGS)
例如:$(CC) -o output $(OBJS) 将会使用 CC 和 OBJS 的值来构建编译命令。
2.命令替换:$() 或 ${} 用于执行命令替换,将命令的输出结果赋给变量。例如:$(shell date '+%Y-%m-%d') 将会获取当前日期并赋给变量。
3.特殊内建变量:$@ 表示规则中的目标文件名。
$^ 表示所有的依赖文件列表。
$< 表示规则中的第一个依赖文件名。
例如:$(CC) -o $@ $^ 表示将所有的依赖文件编译链接生成目标文件。

伪目标

网上的一些介绍,可以增加理解:避免与同名文件冲突:有时候,当前目录中可能会存在与 Makefile 中定义的目标同名的文件,如果这些目标不是伪目标,那么 Make 命令会误以为这是一个文件依赖关系,从而导致错误。通过使用伪目标,可以避免这种冲突。明确指示任务:通过使用伪目标,你可以在 Makefile 中明确地定义一些任务,比如默认编译任务、清理任务等,使得其他人阅读代码时更容易理解 Makefile 的意图。确保每次执行:由于伪目标并不对应真实文件,因此无论是否存在同名文件,Make 命令都会执行伪目标定义的任务,这样可以确保每次执行都能按照预期执行相应的命令。但记住下面这个就可以了:
当执行 make 命令时,Make 工具会按照规则执行 all 或 clean 相应的命令,而不会考虑是否存在同名文件

示例:

# 默认目标
all: $(TARGET)# 清理规则
clean:rm -rf $(BUILD_DIR) $(BIN_DIR).PHONY: all clean

函数

wildcard

原型:

$(wildcard pattern)pattern 是一个文件名模式,可以包含通配符 * 和 ?。wildcard 函数会将满足模式的文件列表返回给调用者。

作用:

用于匹配文件名模式并返回匹配的文件列表

示例:

假设当前目录下有以下文件:
src/main.c
src/util.c
include/header.h
我们可以使用 wildcard 函数来匹配以 .c 结尾的所有源文件:
SRC_FILES := $(wildcard src/*.c)
这将返回 src/main.c 和 src/util.c,并将其赋给 SRC_FILES 变量。wildcard 函数在 Makefile 中常用于收集源文件列表、头文件列表等,以便在后续的编译或构建过程中使用。

多目录、文件操作

不同makefile文件相互调用

# 主Makefile文件sub_mk := ./src//ctrl/sub_ctrl.mk# 默认目标
all: @echo "building ..."@$(MAKE) -f $(sub_mk)
# 子Makefile文件.PHONY: SUB_CTRLSUB_CTRL:@echo "SUB_CTRL makefile test !!"

现象:

building ...
make[1]: 进入目录“/home/psd/code_space/my_project_space/user_space/test/camera_usb/test”
SUB_CTRL makefile test !!
make[1]: 离开目录“/home/psd/code_space/my_project_space/user_space/test/camera_usb/test”

2.思路梳理

需求分析

项目初期: 建立测试目录进行模块化的基础功能使能那对于makefile的需求:1.对涉及到的.c源文件进行编译;2.将编译生成的中间文件以及目标文件存放到相应的目录里面3.顶层目录下执行make即可实现整个项目的编译作用4.make clean 可以清除中间文件和已生成的目标文件其他拓展需求:1.

目录结构

后续测试模块内容写完直接使用tree命令补充:# 源文件目录
SRC_DIR := src# 头文件目录
INC_DIR := include# 目标文件目录
BUILD_DIR := build# 可执行文件输出目录
BIN_DIR := bin# 源文件
SRCS := $(wildcard $(SRC_DIR)/**/*.c)# 目标文件
OBJS := $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)# 可执行文件
TARGET := $(BIN_DIR)/$(PROJECT_NAME)

3.可行示例

# 项目名称
PROJECT_NAME := USB_CAMERA# 编译器
CC := gcc# 编译选项
CFLAGS := -Wall -Wextra -g# 源文件目录
SRC_DIR := src# 头文件目录
INC_DIR := include# 目标文件目录
BUILD_DIR := build# 可执行文件输出目录
BIN_DIR := bin# 源文件
SRCS := $(wildcard $(SRC_DIR)/**/*.c)# 目标文件
OBJS := $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)# 可执行文件
TARGET := $(BIN_DIR)/$(PROJECT_NAME)# 默认目标
all: $(TARGET)# 编译目标
$(TARGET): $(OBJS) | $(BIN_DIR)$(CC) $(CFLAGS) $^ -o $@# 编译规则
# 生成目标文件的规则
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
#创建目录(如果不存在)@mkdir -p $(dir $@)$(CC) $(CFLAGS) -c $< -o $@# 创建目录
$(BUILD_DIR):mkdir -p $@$(BIN_DIR):mkdir -p $@# 清理规则
clean:rm -rf $(BUILD_DIR) $(BIN_DIR).PHONY: all clean

相关文章:

项目集成过程中的makefile记录

项目集成过程中的makefile记录 文章目录 项目集成过程中的makefile记录1.基础概念注释打印赋值方式常用变量$ 伪目标函数wildcard 多目录、文件操作 2.思路梳理**需求分析**目录结构 3.可行示例 持续更新中1.基础概念 注释 # 示例&#xff1a; # 项目名称打印 echo "H…...

Vue3 -Computed计算属性

前言&#xff1a; Computed属性属于Vue3中的响应式核心(与之共同说明的还有ref&#xff0c;reactive&#xff0c;watch...) 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set…...

MySQL—函数—日期函数(基础)

一、引言 接下来讨论和学习关于函数的第三个方面——日期函数。 常见的MySQL当中的日期函数。 注意&#xff1a; 1、CURDATE()&#xff1a;cur&#xff1a;current 当前的&#xff0c;返回的是当前日期。 2、CURTIME()&#xff1a;当前时间。 3、NOW&#xff1a;当前的日期和…...

Java+SVNCloud+Mysql课程设计

文章目录 1、主要内容2、所需准备3、与sql访问的中间类&#xff1a;SqlMessage4、窗口界面5、main方法 1、主要内容 课程设计&#xff0c;主要通过Javas wing创建窗口&#xff0c;jdbc连接云端mysql数据库进行基本操作&#xff0c;支持随机生成数据并用动态展示数据结果。 先…...

MySQL之创建高性能的索引(四)

创建高性能的索引 空间数据索引(R-Tree) MyISAM表支持空间索引&#xff0c;可以用作地理数据存储。和B-Tree索引不同&#xff0c;这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时&#xff0c;可以有效地使用任意维度来组合查询。必须使用MySQL的GIS相关函数如…...

Python 限制输入数的范围

Python 限制输入数的范围 在 Python 编程中&#xff0c;我们经常需要限制用户输入的数据范围&#xff0c;以避免一些可能出现的问题。例如&#xff0c;在一个游戏程序中&#xff0c;我们可能想要确保玩家的分数在某个范围内&#xff0c;而不是太高或太低。在这个博文中&#x…...

STM32两轮平衡小车原理详解

STM32两轮平衡小车是一种基于STM32微控制器的智能机器人&#xff0c;它能够通过传感器和算法实现自我平衡。以下是对STM32两轮平衡小车原理的详解&#xff0c;以及一些基础的代码示例。 原理详解 1. 系统组成 主控制器&#xff1a;STM32系列微控制器&#xff0c;作为小车的大…...

(笔记)如何评价一个数仓的好坏

如何评价一个数仓的好坏 1数据质量产生原因评估方法流程 2模型建设产生问题原因评估方法流程 3数据安全产生问题原因评估方法流程 4成本/性能产生问题原因评估方法流程 5 用户用数体验产生问题原因评估方法流程 6数据资产覆盖产生问题原因评估方法流程 数仓评价好坏是对数仓全流…...

友善RK3399v2平台利用rkmpp实现硬件编解码加速

测试VPU 编译mpp sudo apt update sudo apt install gcc g cmake make cd ~ git clone https://github.com/rockchip-linux/mpp.git cd mpp/build/linux/aarch64/ sed -i s/aarch64-linux-gnu-gcc/gcc/g ./arm.linux.cross.cmake sed -i s/aarch64-linux-gnu-g/g/g ./arm.lin…...

Mysql 8.0 主从复制及读写分离搭建记录

前言 搭建参考&#xff1a;搭建Mysql主从复制 为什么要做主从复制&#xff1f; 做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。架构的扩展。业务量越来越大&#xff0c;I/O访问频…...

PyTorch、显卡、CUDA 和 cuDNN 之间的关系

概述 PyTorch、显卡、CUDA 和 cuDNN 之间的关系及其工作原理可以这样理解&#xff1a; 显卡 (GPU) 显卡&#xff0c;特别是 NVIDIA 的 GPU&#xff0c;具有大量的并行处理单元&#xff0c;这些单元可以同时执行大量相似的操作&#xff0c;非常适合进行大规模矩阵运算&#x…...

Lambda 表达式练习

目录 sorted() 四种排序 List 转 Map map 映射 对象中 String 类型属性为空的字段赋值为 null BiConsumer,> T reduce(T identity, BinaryOperator accumulator) allMatch(Predicate p) groupingBy(Function f) flatMap(Function f) Optional.ofNullable(T t) 和 …...

JavaScript第七讲:数组,及练习题

目录 今天话不多说直接进入正题&#xff01; 1. 创建数组对象 2. 数组长度 3. 遍历一个数组 4. 连接数组 5. 通过指定分隔符&#xff0c;返回一个数组的字符串表达 6. 分别在最后的位置插入数据和获取数据(获取后删除) 7. 分别在最开始的位置插入数据和获取数据(获取后删…...

从docker镜像反推Dockerfile

在项目运维的过程中&#xff0c;偶尔会遇到某个docker image打包时候的Dockerfile版本管理不善无法与image对应的问题&#xff0c;抑或需要分析某个三方docker image的构建过程&#xff0c;这时&#xff0c;就希望能够通过image反推构建时的instruction. 想实现这个过程可以使…...

车载软件架构 - AUTOSAR 的信息安全框架

车载软件架构 - AUTOSAR 的信息安全架构 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗…...

欧洲版“OpenAI”——Mistral 举办的 AI 大模型马拉松

近期&#xff0c;法国的 Mistral AI 举办了一场别开生面的 AI 大模型马拉松。要知道&#xff0c;Mistral 可是法国对 OpenAI 的有力回应&#xff0c;而且其技术还是完全开源的呢&#xff01;这场在巴黎举行的黑客马拉松&#xff0c;规模空前盛大&#xff0c;竟然有超过 1000 名…...

Java | Leetcode Java题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution {public int longestConsecutive(int[] nums) {Set<Integer> num_set new HashSet<Integer>();for (int num : nums) {num_set.add(num);}int longestStreak 0;for (int num : num_set) {if (!num_set.contai…...

C++的List

List的使用 构造 与vector的区别 与vector的区别在于不支持 [ ] 由于链表的物理结构不连续,所以只能用迭代器访问 vector可以排序,list不能排序(因为快排的底层需要随机迭代器,而链表是双向迭代器) (算法库里的排序不支持)(需要单独的排序) list存在vector不支持的功能 链…...

网易有道QAnything使用CPU模式和openAI接口安装部署

网易有道QAnything可以使用本地部署大模型&#xff08;官网例子为qwen&#xff09;也可以使用大模型接口(OPENAI或者其他大模型AI接口 )的方式&#xff0c;使用在线大模型API接口好处就是不需要太高的硬件配置。 本机环境windows11 首先安装WSL环境, 安装方法参考https://zhuan…...

量子加速超级计算简介

本文转载自&#xff1a;量子加速超级计算简介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目录 一、概述二、量子计算机的构建块&#xff1a;QPU 和量子位三、量子计算硬件和算法四、…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...