当前位置: 首页 > 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 更加灵活强大,适合大型项目和跨平台开发。

http://www.lryc.cn/news/66412.html

相关文章:

  • 通过OpenCL内核代码猜测设备寄存器个数
  • C# + .Net6 实现TensorFlow图片分类
  • Ngnix负载均衡和高可用集群及搭建与相关理论
  • 2022年宜昌市网络搭建与应用竞赛样题(三)
  • 为什么PCB设计完成后需要放置mark点
  • 代理IP:IP代理技术与Socks5协议
  • 如何让java程序员生涯更顺利?我聊聊提升技术水平的五个方面
  • 快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解
  • ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!
  • 自学黑客(网络安全),一般人我劝你还是算了吧
  • 盘“底座”,盘出新生意经
  • 《花雕学AI》Poe:一个让你和 AI 成为朋友的平台,带你探索 ChatGPT4 和其他 八种AI 模型的奥秘
  • 单片机GD32F303RCT6 (Macos环境)开发 (十五)—— i2c1采用DMA方式的读写函数
  • 通知短信 API 技术细节以及发送流程机制原理解析
  • Protobuf: 高效数据传输的秘密武器
  • 第五十四章 Unity 移动平台输入(下)
  • KD305Y带吸收比极化指数兆欧表
  • 磁盘空间不足怎么办?释放磁盘空间的4种方法
  • ChatGPT调教指北,技巧就是效率!
  • Android启动流程(五)——init进程对子进程的监控
  • Python每日一练:蚂蚁家族(详解集合法)
  • 图神经网络:在KarateClub数据集上动手实现图神经网络
  • ArduPilot之开源代码调试技巧
  • Linux网络基础-2
  • 软件测试报告模板
  • 记一次azkaban调度异常处理
  • 开发一个vue自定义指令的npm库-系列三:使用rollup打包npm库并发布
  • C嘎嘎的运算符重载基础教程以及遵守规则【文末赠书三本】
  • 【MCAL_UART】-1.2-图文详解RS232,RS485和MODBUS的关系
  • 设计模式详解(二)——单例模式