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

Makefile和Cmake

        makefile工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

        CMake允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。

项目规模:对于小型项目,使用Makefile可能更加简单和方便。 但是对于大型项目,使用CMake可以更好地组织和管理代码。 自动化构建:如果您需要自动化构建过程,则CMake是更好的选择,因为它可以自动生成Makefile并自动化构建过程。

一、Makefile

先举一个例子:

all:test@echo "hello all"

在这个简单的实例里面,包含了Makefile三要素:

目标:all

依赖:test

命令:@echo "hello all"

那么,如果我们要编译多个c/cpp文件,该如何做?

.PHONY:main clean
simple:main.o foo.ogcc -o simple main.o foo.o
main.o:main.cgcc -o main.o -c main.c
foo.o:foo.cgcc -o foo.o -c foo.c
clean:rm simple main.o foo.o

如上所示:

我们的目标是生成.PHONY文件,就需要先编译.c文件生成对应的.o文件,.o文件生成

对应的可执行文件。

.PHONY: all clean:声明 all 和 clean 是伪目标。即使有同名文件存在,make 仍会执行这些目标的命令。

simple: main.o foo.o:定义 simple 目标,它依赖于 main.o 和 foo.o。当这两个对象文件都存在时,会执行后面的命令。

main.o: main.c 和 foo.o: foo.c:分别定义 main.o 和 foo.o 的依赖关系,表示这两个目标依赖于各自的源文件。

clean:定义 clean 目标,用于清理构建过程中生成的文件。

makefile工作原理

Makefile进阶:

.PHONY: all cleanMKDIR = mkdir
RM = rm
RMFLAGS = -fr
CC = gcc
EXE = complicated
DIRS = objs exes
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)all: $(DIRS) $(EXE)
$(DIRS):$(MKDIR) $@
$(EXE): $(OBJS)$(CC) -o $@ $^
%.o: %.c$(CC) -o $@ -c $^
clean:$(RM) $(RMFLAGS) $(DIRS) $(EXE) $(OBJS)

伪目标

  • .PHONY: all clean:声明 all 和 clean 是伪目标,不会与文件名冲突。

变量定义

  • MKDIR = mkdir:定义创建目录的命令。

  • RM = rm:定义删除文件的命令。

  • RMFLAGS = -fr:定义删除时的选项,-f 表示强制删除,-r 表示递归删除。

  • CC = gcc:定义使用的编译器为 GCC。

  • EXE = complicated:定义最终生成的可执行文件名。

  • DIRS = objs exes:定义需要创建的目录。

  • SRCS = $(wildcard *.c):获取当前目录下所有的 .c 源文件。

  • OBJS = $(SRCS:.c=.o):将源文件列表中的 .c 后缀替换为 .o,得到目标文件列表。

规则

  • all: $(DIRS) $(EXE):构建目标为 all,依赖于 DIRSEXE

  • $(DIRS)::对于每个目录,在构建时创建这些目录。

    • $(MKDIR) $@:命令为创建目录,$@ 是当前目标(即 objs 和 exes)。

  • $(EXE): $(OBJS):生成可执行文件的规则,依赖于所有目标文件。

    • $(CC) -o $@ $^:用 GCC 编译所有目标文件生成可执行文件,$@ 是目标文件名,$^ 是所有依赖文件。

  • %.o: %.c:模式规则,表示如何从 .c 文件生成 .o 文件。

    • $(CC) -o $@ -c $^:使用 GCC 编译 .c 文件为 .o 文件,-c 表示只编译而不链接。

清理规则

  • clean::用于清除生成的文件和目录的规则。

    • $(RM) $(RMFLAGS) $(DIRS) $(EXE) $(OBJS):执行删除命令,删除指定的目录、可执行文件和目标文件。

Make和Makefile_make,makefile-CSDN博客进一步了解可以看看这篇博客,讲的很清楚。

二、CMake

我们用Cmake实现makefile相同功能。

# Cmake最低版本号
cmake_minimum_required(VERSION 3.10)# 设置项目名称
project(SimpleProject)# 添加可执行文件
add_executable(simple main.c foo.c)# 清理目标(可选)
set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "simple")

进入构建目录并运行 CMake:

mkdir build

cd build

cmake ..

make


http://www.mrgr.cn/news/47899.html

相关文章:

  • 详解GPT-信息抽取任务 (GPT-3 FAMILY LARGE LANGUAGE MODELS)
  • 信息筛查系统的实战开发与实现
  • 【C语言】可移植性陷阱与缺陷(七): 除法运算时发生的截断
  • 如何实现el-select多选下拉框中嵌套复选框并加校验不为空功能呢?
  • 面试场景题系列:设计搜索自动补全系统
  • 区块链方向学习路线
  • 高职图书分享|校企联合开发教材《前端可视化框架应用开发》
  • 模型案例:| SenseCraft Al平台模型训练与部署
  • 10.9文件操作
  • 机器学习中的多模态学习:用C/C++实现高效模型
  • 数字隔离器的技术竞争
  • 【AI-20】训练服务器和推理服务器
  • [权威出刊|稳定检索]2024年光学工程与检测技术国际会议(OETT 2024)
  • Fastgpt本地化部署 - 以MAC为例
  • IP-Guard与Ping32两大加密软件对比:安全性、功能与性能全面评测
  • Solon 3.0 新特性:SqlUtils
  • 跨境网络专线SD-WAN:跨境电商网络问题的解决方案
  • 计算机毕业设计 | SSM 旅游网站后台管理系统(附源码)
  • 使用BarTender打印
  • 国产光耦:实际应用和市场进展
  • 利士策分享,重阳节的传承及意义在哪里?
  • Linux内核编译的整体理解
  • python爬虫 - 深入正则表达式
  • 基于springboot vue 网络云端日记本系统设计与实现
  • 视频里的声音怎么单独提取出来?简单又实用的10种提取声音方法!
  • 如何在建设 DataOps 体系中选择合适的工具或平台?