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

makefile和cmake

Makefile 是一种文件,它定义了一个项目中的编译规则、依赖关系和构建过程。Makefile 可以自动化地构建和管理项目,使得整个项目的构建过程更加高效和可靠。下面是 Makefile 的常用语法:

1. 定义变量

变量可以用来保存一些常用的参数和路径,以便在后面的规则中使用。变量的定义格式为:变量名 = 变量值。例如:

```

CC = gcc
CFLAGS = -Wall -O2


```

2. 定义规则

规则是 Makefile 中最重要的部分,它定义了如何生成目标文件和依赖关系。规则的格式为:

```

target: dependenciescommand


```

其中,target 是生成的目标文件,dependencies 是依赖的文件或目录,command 是生成目标文件的命令。例如:

```

hello: main.o func.o$(CC) -o hello main.o func.o


```

3. 定义伪目标

伪目标是一种特殊的目标,它并不对应任何文件,只是用来执行一些操作。伪目标的格式为:

```

.PHONY: target


```

例如:

```

.PHONY: clean
clean:rm -f *.o hello


```

4. 定义通配符

通配符可以用来匹配一组文件名或目录名。常用的通配符有 *(匹配任意字符)、?(匹配一个字符)和 %(匹配任意字符串)。例如:

```

SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))


```

上面的代码中,$(wildcard *.c) 匹配所有的 .c 文件,$(patsubst %.c, %.o, $(SRC)) 将所有的 .c 文件替换为对应的 .o 文件。

下面是一个完整的示例 Makefile,其中包含了上述语法的使用:

```

CC = gcc
CFLAGS = -Wall -O2
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC)).PHONY: all cleanall: hellohello: $(OBJ)$(CC) -o $@ $^%.o: %.c$(CC) $(CFLAGS) -c $< -o $@clean:rm -f *.o hello


```

上面的代码中,定义了变量 CC 和 CFLAGS,分别表示编译器和编译选项。使用了通配符 $(wildcard *.c) 和 $(patsubst %.c, %.o, $(SRC)) 来匹配所有的 .c 文件和对应的 .o 文件。使用了规则来生成目标文件和依赖关系,其中 $(OBJ) 表示所有的 .o 文件,$@ 表示目标文件名,$^ 表示所有的依赖文件,$< 表示第一个依赖文件。使用了伪目标 clean 来清理生成的文件。

Makefile 和 CMake 都是用于构建和管理项目的工具,但它们的实现方式和使用方法有所不同。

Makefile 是一种文本文件,它定义了项目中的编译规则、依赖关系和构建过程。Makefile 使用 make 工具来自动化地构建和管理项目,其中 make 工具会根据 Makefile 中的规则来生成目标文件和依赖关系。Makefile 的优点是简单易懂,可以直接在终端中使用,但是当项目变得复杂时,需要手动编写的规则会变得很繁琐。

CMake 是一种跨平台的构建工具,它使用一种类似于编程语言的方式来定义项目的构建和依赖关系。CMake 会根据 CMakeLists.txt 文件来生成 Makefile 或其他构建系统所需的文件,然后使用相应的构建系统来构建项目。CMake 的优点是可以跨平台使用,支持多种构建系统,可以自动生成 Makefile,使得构建过程更加高效和可靠,但是需要学习一定的语法和使用方法。

总的来说,Makefile 更加简单易用,适合小型项目和快速开发,而 CMake 更加灵活强大,适合大型项目和跨平台开发。

相关文章:

makefile和cmake

Makefile 是一种文件&#xff0c;它定义了一个项目中的编译规则、依赖关系和构建过程。Makefile 可以自动化地构建和管理项目&#xff0c;使得整个项目的构建过程更加高效和可靠。下面是 Makefile 的常用语法&#xff1a; 1. 定义变量 变量可以用来保存一些常用的参数和路径&…...

通过OpenCL内核代码猜测设备寄存器个数

在OpenCL标准中&#xff0c;没有给出查看计算设备一共有多少寄存器&#xff0c;至少能分配给每个work-item多少寄存器使用的特征查询。而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素&#xff0c;因此我这边提供一个比较基本的方法来猜测当前计…...

C# + .Net6 实现TensorFlow图片分类

微软官网上发现一篇很有意思的文档&#xff1a;教程&#xff1a;用于对图像进行分类的 ML.NET 分类模型 - ML.NET | Microsoft Learn 这篇教程写的很学院派&#xff0c;但有点碎&#xff0c;属于上课不能打一秒钟瞌睡的那种。好在还是给出了完整的代码&#xff1a;samples/Pro…...

Ngnix负载均衡和高可用集群及搭建与相关理论

Ngnix负载均衡和高可用集群及搭建与相关理论 全文目录 Ngnix负载均衡和高可用集群及搭建与相关理论高可能保持原理配置 keepalived&#xff1a;配置keepalived的IP将外部域名解析到Keepalived的虚拟IP上如何验证配置的正确性Nginx专用调试工具ngx_conf_t如何对前后端多台服务器…...

2022年宜昌市网络搭建与应用竞赛样题(三)

网络搭建与应用竞赛样题&#xff08;三&#xff09; 技能要求 &#xff08;总分1000分&#xff09; 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;网络搭建及安全部署项目&#xff08;500分&#xff0…...

为什么PCB设计完成后需要放置mark点

PCB设计中的Mark点是指一些标记点&#xff0c;通常用于促进PCB制造和组装过程中的准确性和一致性。这些标记点在制造过程中可以帮助操作员进行自动化定位&#xff0c;从而确保所有部件都被正确组装到其正确位置&#xff0c;这对于确保产品的质量和可靠性至关重要。 下面&#…...

代理IP:IP代理技术与Socks5协议

代理IP是一种用于隐藏真实IP地址的技术&#xff0c;它可以将请求发送至代理服务器&#xff0c;再由代理服务器转发请求至目标网站。代理服务器会在请求过程中替换真实IP地址&#xff0c;从而保护用户的隐私和安全。在网络爬虫、反爬虫、匿名访问等场景中&#xff0c;代理IP技术…...

如何让java程序员生涯更顺利?我聊聊提升技术水平的五个方面

今天我想和大家聊聊程序员职业发展的问题。相信大家都知道&#xff0c;IT公司因为各种原因裁员&#xff0c;对程序员的前途发展都是不利的。特别是等到你30多岁&#xff0c;上有老下有小&#xff0c;仍然要加班&#xff0c;与年轻人竞争体力和智力&#xff0c;这是很艰难的。如…...

快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&a…...

ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!

前言 ChatGPT由于在访问上有一些限制&#xff0c;使用并不便利。目前国内可以直接访问的大部分是调用API返回结果&#xff0c;我们去使用时总会有次数限制&#xff0c;而且它们可能随便崩掉。 其实&#xff0c;目前我们访问过的大部分国内的网页包括UI&#xff0c;其实是套用了…...

自学黑客(网络安全),一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…...

盘“底座”,盘出新生意经

本文转自首席信息官 作者 徐蕊 导读 卖“底座”&#xff0c;这是一门新的生意&#xff0c;也是用友与友商差异化的商业竞争优势所在。 大型企业都在建“数智化底座” 有这样两类企业&#xff0c;他们截然不同&#xff0c;但在数智化的建设上殊途同归。 随着中国经济的发展&a…...

《花雕学AI》Poe:一个让你和 AI 成为朋友的平台,带你探索 ChatGPT4 和其他 八种AI 模型的奥秘

你是否曾经梦想过&#xff0c;能够在一个平台上&#xff0c;和多种不同的 AI 模型进行有趣、有用、有深度的对话&#xff0c;甚至还能轻松地把你的对话分享给其他人&#xff1f;如果你有这样的梦想&#xff0c;那么 Poe 一站式 AI 工具箱就是你的不二之选&#xff01; Poe 是国…...

单片机GD32F303RCT6 (Macos环境)开发 (十五)—— i2c1采用DMA方式的读写函数

i2c1采用DMA方式的读写函数 1、关于i2c1的DMA的映射如图 2、关于代码的宏定义配置 Application目录的Makefile中 ENABLE_I2C_TEST yes才会编译I2C1的相关代码。 同时修改i2c.h文件&#xff0c;定义I2C1_MODE为I2C1_MODE_DMA&#xff0c;这样i2c1的配置为dma模式。 #define …...

通知短信 API 技术细节以及发送流程机制原理解析

引言 短信是一种简单、直接、高效的通信方式&#xff0c;被广泛应用于各个领域。在移动互联网时代&#xff0c;短信成为了客户服务、政府通知、公共服务等方面的重要工具。为了更好地利用短信这种通信方式&#xff0c;通知短信 API应运而生。短信API可以帮助企业、政府和应用程…...

Protobuf: 高效数据传输的秘密武器

当涉及到网络通信和数据存储时&#xff0c;数据序列化一直都是一个重要的话题&#xff1b;特别是现在很多公司都在推行微服务&#xff0c;数据序列化更是重中之重&#xff0c;通常会选择使用 JSON 作为数据交换格式&#xff0c;且 JSON 已经成为业界的主流。但是 Google 这么大…...

第五十四章 Unity 移动平台输入(下)

本章节我们介绍一个模拟器插件。这种插件比较多&#xff0c;比如EasyTouch&#xff0c;Lean Touch&#xff0c;Joystick Pack等等。EasyTouch是一个使用非常广泛的插件&#xff0c;支持点击&#xff0c;拖拽&#xff0c;遥感等很多常用功能。不过遗憾的是&#xff0c;该插件已经…...

KD305Y带吸收比极化指数兆欧表

一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如&#xff1a;电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验&#xff0c;首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加&#xff0c;用普通的兆欧表无…...

磁盘空间不足怎么办?释放磁盘空间的4种方法

虽然现在硬盘的空间越来越大&#xff0c;但是在这个数据爆炸的时代中&#xff0c;总是会觉得存储空间不够用&#xff0c;一不注意磁盘就满了&#xff0c;那么除了清空回收站、卸载某些程序外&#xff0c;还能怎么释放磁盘空间呢&#xff1f; 方案一&#xff1a;禁用休眠 休眠是…...

ChatGPT调教指北,技巧就是效率!

技巧就是效率 很多人都知道ChatGPT很火很强&#xff0c;几乎无所不能&#xff0c;但跨越了重重门槛之才有机会使用的时候却有些迷茫&#xff0c;一时间不知道如何使用它。如果你就是把他当作一个普通的智能助手来看待&#xff0c;那与小爱同学有什么区别&#xff1f;甚至还差劲…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...