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

一、CMake基础

一、前言

1、什么是CMake, CMake是用来干什么的?

CMake是一个项目构建工具,是用来生成具体的项目编译文件makefile的,CMake是跨平台的。不同的系统下不同的编译器,会根据各自的实际情况生成makefile,然后再进行编译项目,常见的编译器例如Linux下的gcc, vs下的clang等。

2、什么是makefile,有什么作用?源代码到可执行文件,或者库文件的编译过程?

makefile用于定义项目的编译规则,指导 make(自动化构建工具) 工具如何构建程序(可执行文件或库文件)。它本质上是一份 "编译说明书",包含了源文件之间的依赖关系、编译命令等信息。make工具再根据这个编译说明书,指导编译器去编译。Makefile 是用于自动化管理编译过程,解决手动编译的繁琐和低效问题。

软件编译的过程大体上可分为以下四步:(预处理->编译->汇编->链接

2.1、预处理

        作用:处理源代码中的预处理指令(如 #include#define#ifdef 等),头文件展开宏替换,删除注释

2.2、编译

        作用:将预处理后的源代码翻译成汇编语言。进行语法分析、语义分析、优化,最终生成汇编代码,生成汇编文件常见为.s文件。

2.3、汇编

作用汇编器将汇编语言翻译成机器码(二进制指令)。将汇编指令转化为cpu认识的二进制机器码,通常是.o或者.obj结尾的目标文件。

2.4、链接

作用:链接器将多个目标文件和所需的库文件组合成一个可执行文件或库文件。
输出
  • 可执行文件(如 Linux 下的 a.out、Windows 下的 .exe
  • 静态库(如 .a 或 .lib,多个目标文件的归档)
  • 动态库(如 .so.dylib 或 .dll,可被多个程序共享)

makefile文件举例:

# 检测操作系统
ifeq ($(OS),Windows_NT)# Windows 系统RM = del /f /qMKDIR = mkdirEXE_EXT = .exe
else# Linux/macOS 系统RM = rm -fMKDIR = mkdir -pEXE_EXT =
endif# 编译器和目标文件
CC = gcc
TARGET = myapp$(EXE_EXT)
OBJS = main.o utils.o# 默认目标
all: $(TARGET)# 生成可执行文件
$(TARGET): $(OBJS)$(CC) -o $@ $(OBJS)# 编译规则
%.o: %.c$(CC) -c $< -o $@# 创建输出目录
dir:$(MKDIR) bin# 清理
clean:$(RM) $(TARGET) $(OBJS).PHONY: all clean dir

二、CMake概述

从前言可以看出编写 makefile较为复杂,且解决依赖关系时也容易出错,这里亟待一个自动化构建可编译项目的工具,Cmake就应运而生,解决了上述痛点。

CMake自动生成本地化的Makefile和工程文件,最后用户只需make编译即可,下面是其构建项目并编译的流程。

CMake的优点:

1、跨平台,根据不同的平台环境生成对应的makefile文件;

2、可以进行大型项目管理

3、简化构建过程,以及编译流程,根据当前环境构建适合当前环境配置的编译文件

4、可拓展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能;

三、CMake项目构建方式

例如下源代码与CMakeLists.txt的目录组织结构

CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)# 项目名称和支持的语言(显式指定C语言)
project(CMTEST LANGUAGES C)# 设置C标准版本(根据需要调整,例如C99、C11)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(app main.c divmoule.c addmoule.c) # 添加可执行文件# Debug模式专用配置
if(CMAKE_BUILD_TYPE STREQUAL "Debug")# 启用调试符号和额外警告target_compile_options(app PRIVATE -g         # 生成调试信息-Wall      # 启用所有警告-Wextra    # 启用额外警告-O0        # 关闭优化(Debug模式通常不优化))
endif()

1、项目构建与源文件在同一目录下

1.1、构建生成项目

使用的是 Visual Studio 17 2022 生成器(通过 -- Building for: Visual Studio 17 2022 可见),这种情况下 CMake 会生成 Visual Studio 专用的解决方案文件(.sln)和项目文件(.vcxproj),而不是 Makefile,这是正常现象。

Makefile 通常在类 Unix 系统(Linux、macOS)或 Windows 下使用 MinGW、Cygwin 等工具链时才会生成。如果需要生成 Makefile,需要在运行 CMake 时指定对应的生成器

1.2、编译生成可执行文件

通过Visual Studio 打开CMTEST.sln项目,编译生成如下:

2、项目构建与源文件不在同一目录下

项目构建与源码分离的方式,最主流常见的项目构建方式。

2.1、生成项目在另外的目录下:

2.2、打开项目sln编译生成可执行文件

四、总结

至此,我们从 CMake 与 Makefile 的基础概念入手,理清了软件编译的核心流程,也详细介绍了 CMake 的优势与两种主流项目构建方式,推荐使用项目构建与源代码分离的方式,对于刚接触 CMake 的开发者而言,从这份基础指南开始,尝试编写简单的CMakeLists.txt,逐步实践源码分离的构建模式,就能快速上手并感受到其在项目管理中的便捷性。


文章转载自:

http://aaH3RTsJ.mdwLg.cn
http://JxbeVONN.mdwLg.cn
http://GBzaPCUW.mdwLg.cn
http://TnPwdjkM.mdwLg.cn
http://pnam1RhG.mdwLg.cn
http://wOBFzyAh.mdwLg.cn
http://43qfhG1C.mdwLg.cn
http://zBAHVV21.mdwLg.cn
http://EsFuKi4p.mdwLg.cn
http://D2fhg2Vj.mdwLg.cn
http://lYUaezLR.mdwLg.cn
http://eTLLq9YL.mdwLg.cn
http://BFEGR7WN.mdwLg.cn
http://d1JlbxNl.mdwLg.cn
http://kCUQHPuh.mdwLg.cn
http://S31yGIRN.mdwLg.cn
http://lklEp7rN.mdwLg.cn
http://DoqN8xub.mdwLg.cn
http://0o08lAtV.mdwLg.cn
http://aUFPs41x.mdwLg.cn
http://AFmo5ELD.mdwLg.cn
http://LQNxfW06.mdwLg.cn
http://hKdYMQMW.mdwLg.cn
http://MYWT0SBn.mdwLg.cn
http://j4x5xjt5.mdwLg.cn
http://VhOSybQP.mdwLg.cn
http://pjx7svwn.mdwLg.cn
http://ljhYfE6H.mdwLg.cn
http://aQxcpHjk.mdwLg.cn
http://NX50wB2k.mdwLg.cn
http://www.dtcms.com/a/371299.html

相关文章:

  • 【音视频】WebRTC P2P、SFU 和 MCU 架构
  • VBA 自动转化sheet到csv文件
  • rabbitmq 重试机制
  • 《C++进阶之STL》【set/map 使用介绍】
  • 【RabbitMQ】----初识 RabbitMQ
  • WebRTC开启实时通信新时代
  • JVM-默背版
  • Java内存区域与内存溢出
  • Python3使用Flask开发Web项目新手入门开发文档
  • 深入理解跳表:多层索引加速查找的经典实现
  • 从 “Hello AI” 到企业级应用:Spring AI 如何重塑 Java 生态的 AI 开发
  • 大模型架构演进全景:从Transformer到下一代智能系统的技术路径(MoE、Mamba/SSM、混合架构)
  • leetcode 912 排序数组(归并排序)
  • Flutter SDK 安装与国内镜像配置全流程(Windows / macOS / Linux)
  • 【算法】92.反转链表Ⅱ--通俗讲解
  • Spring Cloud Alibaba快速入门02-Nacos(上)
  • Selenium自动化测试
  • B.50.10.11-Spring框架核心与电商应用
  • 芯片ATE测试PAT(Part Average Testing)学习总结-20250916
  • Visual acoustic Field,360+X论文解读
  • Android系统更新系统webview. 2025-09-06
  • Simulink子系统、变体子系统及封装知识
  • 详解 Java 中的 CopyOnWriteArrayList
  • FTL(Flash Translation Layer)
  • C++输出字符串的统一码(Unicode Code)和 ASCII 码
  • 【PCIe EP 设备入门学习专栏 -- 8.1.2 PCIe EP 通路详细介绍】
  • nginx安装部署(备忘)
  • 6.虚拟化历史
  • 疯狂星期四文案网第62天运营日记
  • AI工程师对于AI的突发奇想