cmake初识

news2024/12/23 20:26:44

cmake

  • 什么是软件构建和编译工具
  • cmake
    • 安装cmake
      • windows
      • Linux
  • 通过cmake编译代码
    • 准备CMakeLists.txt
    • 注释
    • 块状注释
    • cmake_minimum_required:确定cmake的最低版本
    • project:定义工程名称:
    • add_executable:定义工程会生成一个可执行程序
    • 准备生成可执行文件
  • set
    • 设置变量
    • 指定输出路径
    • 设置C++标准
  • 搜索文件
      • aux_source_directory 命令可以查找某个路径下的所有源文件
      • file
  • 指定头文件目录
  • 插件配置

之前捯饬CLion的时候,发现有这么一个玩意:
在这里插入图片描述发现,CLion和visiual stduio不一样的地方在于CLion会有一个CMakeList的txt文件,这个在visiual stduio中从来没有过,所以自己研究了一下,发现cmake是一个软件构建和编译工具。我们之前学的Makefile也是这样子的一款软件,如果有小伙伴不知道Makefile是什么的,可以点击下方的连接:

https://blog.csdn.net/qq_67693066/article/details/132979925

今天我们要了解的是一款更强大的软件构建和编译工具——cmake。

什么是软件构建和编译工具

在这之前,还是简单介绍一下软件构建和编译工具:

软件构建和编译工具是用于自动化软件开发过程中的构建和编译任务的工具。它们可以大大简化和加速软件开发流程,并确保软件项目的可靠性和可重复性。这些工具通常提供以下功能:
1.编译代码: 编译工具负责将源代码文件转换为可执行文件或库文件。它们将源代码翻译成计算机可以理解的二进制格式。
2.依赖管理: 许多软件项目依赖于其他软件包或库。构建工具可以自动管理这些依赖关系,确保项目所需的所有组件都是可用的,并在必要时下载或安装它们。
3.代码打包: 构建工具可以将编译后的代码打包成可部署的软件包,如可执行文件、安装程序或容器镜像等。
4.自动化测试: 构建工具可以集成自动化测试框架,并在构建过程中运行测试,以确保代码的质量和稳定性。
5.静态分析: 一些构建工具提供静态代码分析功能,可以检测代码中的潜在问题、错误或不良实践,并提供改进建议。
6.部署支持: 构建工具可以集成部署管道,简化将软件部署到生产环境的过程,并确保部署过程的可靠性和一致性。

以下是一些常见的软件构建和编译工具:

Make: 最早的构建工具之一,用于管理基于文件依赖关系的构建任务。
Apache Ant: 用于 Java 应用程序的构建工具,基于 XML 配置文件。
Apache Maven: 用于 Java 应用程序的构建工具和项目管理工具,支持依赖管理、项目结构标准化等功能。
Gradle: 用于构建 Java 和 Android 应用程序的灵活构建工具,支持 Groovy 和 Kotlin 语言。
GNU Autotools: 用于 Unix 系统的自动配置和构建工具套件,包括 Autoconf、Automake 和 Libtool。
CMake: 跨平台的开源构建系统,用于管理跨平台项目的构建过程。
MSBuild: 由 Microsoft 开发的构建引擎,用于构建 .NET Framework 和 .NET Core 应用程序。
Webpack: 用于构建现代 Web 应用程序的模块化打包工具。
Bazel: 由 Google 开发的构建工具,用于构建和测试多语言项目。

这些构建和编译工具提供了广泛的功能和支持,可以满足不同类型的软件项目的需求。选择合适的工具取决于项目的特性、开发团队的偏好以及特定的技术栈和环境。

简单来说,有了这些软件,我们编译代码的时候效率会大大提升,省时省力。

cmake

了解这么多,我们来看看cmake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似于UNIX下的automake。CMake的组态档取名为CMakeLists.txt。
CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是CMake和SCons等其他类似系统的区别之处。
CMake的特点主要有:
开放源代码,使用类BSD许可发布。
简化编译构建过程和编译过程。
CMake的使用步骤大致如下:
编写CMakeLists.txt文件。
创建一个build目录(可选),用来存放cmake生成的文件。
进入build目录,执行cmake …命令,将CMakeLists.txt文件转化为make所需的makefile文件。其中,路径“…”表示CMakeLists.txt所在目录(路径可以根据自己CMakeLists.txt所在目录更改)。
在build目录下,执行make命令,生成目标可执行文件
在CMake中,还提供了许多命令和变量来定制构建过程,如设置编译器选项、链接库、包含目录等。这些都可以通过编辑CMakeLists.txt文件来实现。

总的来说,CMake是一个强大而灵活的跨平台编译工具,可以帮助开发者更方便地构建和编译软件项目。

安装cmake

windows

windows下访问官网,下载对应版本即可:
在这里插入图片描述大家可以点击这里跳转:

https://cmake.org/download/

windows大家了解即可,我们主要来看Linux下的:

Linux

Linux下,不同版本的安装方式可能不一样,我这里是apt安装(Centos是yum)
在这里插入图片描述我们可以用cmake --version查看版本:
在这里插入图片描述

通过cmake编译代码

准备CMakeLists.txt

首先我们先创建一个CMakeLists.txt(注意,这里千万不能写错哦):
在这里插入图片描述然后我们进入CMakeLists.txt中去编辑:

注释

cmake的单行注释以#开头:
在这里插入图片描述

块状注释

cmake的多行注释以 #[[ 注释内容 ]]
在这里插入图片描述

cmake_minimum_required:确定cmake的最低版本

我们首先写的第一行是确定cmake的最低版本:
在这里插入图片描述这个其实可加可不加,不加可能会有警告。

project:定义工程名称:

project:定义工程名称:
在这里插入图片描述这个其实是一个比较简单的,它其实还有其他的参数:

# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
       [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
       [DESCRIPTION <project-description-string>]
       [HOMEPAGE_URL <url-string>]
       [LANGUAGES <language-name>...])

比如说:

在这里插入图片描述

add_executable:定义工程会生成一个可执行程序

add_executable:定义工程会生成一个可执行程序:

add_executable(可执行程序名 源文件名称)

在这里插入图片描述

准备生成可执行文件

这样一个最简单的CMakeLists.txt文件我们就写好了,因为我们执行命令之后会有一大堆的其他文件冒出来,所以我们新建一个文件夹,用来存放我们执行命令后产生的一系列多的文件
在这里插入图片描述我们进入这个文件:
在这里插入图片描述然后我们要执行最重要的一步,执行cmake,但在这之前,我们要确定CMakeLists.txt在哪里,我们创建了Building文件夹,我们现在在我们创建了Building文件夹,那么我们的CMakeLists.txt就在上一级的目录(CMake_Test)里:
在这里插入图片描述这个时候就会帮我们构建:
在这里插入图片描述
这个时候,我们看看Building文件下出现了什么:
在这里插入图片描述我们发现有一个Makefile,我们再执行一下make指令:
在这里插入图片描述这个时候显示他已经帮我们构建好了Mybin,我们显示看看:
在这里插入图片描述
我们执行一下Mybin:
在这里插入图片描述
执行成功。

set

设置变量

现在有一个问题add_executable如果依赖的文件很多,写起来就会很长:

在这里插入图片描述其实,我们可以将我们的文件名设置成为一个变量,这样我们用起来就方便多了,要设置变量,我们要使用set

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

比如说这样:
在这里插入图片描述如果我们要使用这个变量,我们要加上$:
在这里插入图片描述

指定输出路径

set除了设置变量,还可以设置输出路径,设置路径专门有一个宏:EXECUTABLE_OUTPUT_PATH

EXECUTABLE_OUTPUT_PATH 是 CMake 中的一个变量,用于指定最终生成的可执行文件的存放目录。当你在 CMakeLists.txt 文件中使用 add_executable 命令来添加一个可执行目标时,CMake 会根据EXECUTABLE_OUTPUT_PATH 变量的值来决定将生成的可执行文件放在哪个目录下

这个路径可以是绝对路径,也可以是相对路径:
CMake 会根据当前的处理上下文(通常是 CMakeLists.txt 文件所在的目录)来解释这个相对路径。这意味着相对路径是相对于当前正在处理的 CMakeLists.txt 文件所在的目录,而不是相对于最终构建出的二进制文件所在的目录。

假如有这么一个目录结构:

my_project/  
    CMakeLists.txt  
    src/  
        main.cpp  
    bin/

并且这样设置:

set(EXECUTABLE_OUTPUT_PATH bin)

这样设置后,CMake 会将生成的可执行文件放在 my_project/bin 目录中,因为 bin 是相对于 CMakeLists.txt 文件所在目录(my_project/)的相对路径。

在这里插入图片描述

设置C++标准

set还可以设置编译时的C++的标准,我们也有一个宏:**CMAKE_CXX_STANDARD **:

# 增加-std=c++11
set(CMAKE_CXX_STANDARD 11)

在这里插入图片描述
现在我们来测试一下,我把Building这个文件夹删除:
在这里插入图片描述重新创建一个文件夹reBuilding,然后执行cmake:
在这里插入图片描述
这个时候,我们看看文件的变化:
在这里插入图片描述发现多了一个bin文件夹,我们此时再执行make:
在这里插入图片描述我们执行一下:
在这里插入图片描述运行成功。

搜索文件

我们已经会了set设置变量来简化了,但这样还是很麻烦,我们希望cmake可以自动帮我们找到源文件进行编译。

aux_source_directory 命令可以查找某个路径下的所有源文件

aux_source_directory 命令可以查找某个路径下的所有源文件:

aux_source_directory(< dir > < variable >)

比如说:
在这里插入图片描述我们可以删除reBuilding里面的所有东西,重建,实验一下:
在这里插入图片描述在这里插入图片描述

file

我们也可以用file来搜索:

file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)

这里有两个参数:

GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。

这里我们可以只用GLOB,因为我们没有递归:
在这里插入图片描述我们清空reBuilding里面的内容,然后再来一次:
在这里插入图片描述然后make的时候报错了:
在这里插入图片描述因为我们没有指定搜索文件的类型,我们加上:
在这里插入图片描述

在这里插入图片描述就OK了~。

指定头文件目录

在编译项目源文件的时候,很多时候都需要将源文件对应的头文件路径指定出来,这样才能保证在编译过程中编译器能够找到这些头文件,并顺利通过编译。在CMake中设置要包含的目录也很简单,通过一个命令就可以搞定了,他就是include_directories:

include_directories(headpath)

在这里插入图片描述在这里插入图片描述

插件配置

如果大家vscode可以连上Linux,可以安装这几个插件,代码可以自动补全:
在这里插入图片描述直接在插件搜索就行了,如果vscode没有脸上Linux的,可以点击这里,手把手教你配置:

https://blog.csdn.net/qq_67693066/article/details/136368891

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1512747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JMH287亲测【鸣潮】一键内测风景端V1.0.2已整理并录制视频教学

资源介绍&#xff1a; 否需要虚拟机&#xff1a;否 文件大小&#xff1a;压缩包约15G 支持系统&#xff1a;win7、win10、win11 硬件需求&#xff1a;运行内存16G 4核及以上CPU独立显卡 资源截图&#xff1a; 下载地址&#xff1a; JMH287【鸣潮】一键端 [V1.0.2]

【C++教程从0到1入门编程】第八篇:STL中string类的模拟实现

一、 string类的模拟实现 下面是一个列子 #include <iostream> namespace y {class string{public: //string() //无参构造函数// :_str(nullptr)//{}//string(char* str) //有参构造函数// :_str(str)//{}string():_str(new char[1]){_str[0] \0;}string(c…

性能卓越,服务周到:亚信安慧AntDB的双重优势

亚信安慧AntDB数据库是一种解决实时流数据处理中数据容灾和一致性问题的创新性解决方案。它不仅能够在处理流数据时确保数据的完整性和准确性&#xff0c;还能精确判断数据故障点&#xff0c;从而避免可能的数据损失和错误。AntDB数据库采用先进的技术和算法&#xff0c;能够实…

道路数据下载

下载链接&#xff1a; Geofabrik 下载服务器

Android 配置打包签名信息的两种方法

目录结构如下&#xff1a; 有2种方式&#xff1a; 第一种&#xff0c;直接配置&#xff1a; signingConfigs { debug { storeFile file("app/keystore.properties") storePassword "111111" keyAlias "key" keyPassword "111111" } …

漏洞复现-万户ezOFFICE系列

万户 安全情报,万户ezOFFICE协同管理平台SendFileCheckTemplateEdit-SQL注入漏洞万户OA DocumentEdit_unite.jsp 存在sql注入万户协同办公平台 ezoffice 未授权访问RCExml代码注入 XXE🔪freemarkerService XXE🔪GeneralWeb-xxeofficeserverservlet + attachmentserver RCE…

前端实现 查询包含分页 以及封装table表格 上手即用!

表格组件是 element plus 中的table 又经过了一层封装 封装的table代码在最底下 <div class"box2"><el-radio-group v-model"radio" style"margin-bottom: 16px"><el-radio-button label"1">类型1</el-radio…

2024/3/11打卡分巧克力(第8届蓝桥杯省赛)——二分

题目 儿童节那天有 K 位小朋友到小明家做客。 小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N 块巧克力&#xff0c;其中第 i 块是 HiWi 的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。 切出的巧克力需要满足&…

亚马逊热卖SN-48B压线钳 2.8/4.8/6.3 300PCS插簧端子压接工具

品牌&#xff1a;SANJIANG 型号&#xff1a;SN-48B(橙色手柄)300PCS 颜色分类&#xff1a;SN-48B(橙色手柄),SN-48B(红蓝双色手柄),300PCS插簧端子,SN-48B(橙色手柄)300PCS,SN-48B(红蓝双色手柄)300PCS SN-48B 300PCS 0.5mm的电线尺寸应与0.5mm的连接器匹配&#xff0c;然后…

软考高级:统一过程阶段和工作流概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

使用Python的zipfile模块巧解Word批量生成问题

目录 一、zipfile模块简介 二、Word文档的结构 三、使用zipfile模块生成Word文档 创建ZIP文件 添加文件到ZIP中 生成Word文档内容 批量生成Word文档 四、案例与代码实现 五、总结 在日常办公和自动化任务中&#xff0c;批量生成Word文档是一个常见的需求。然而&am…

算法练习-牛牛的快递(思路+流程图+代码)

难度参考 难度&#xff1a;简单 分类&#xff1a;分支控制 难度与分类参考题目来源网站。 题目 链接&#xff1a;牛牛的快递__牛客网 (nowcoder.com) 来源&#xff1a;牛牛的快递__牛客网 (nowcoder.com) 牛牛正在寄快递&#xff0c;他了解到快递在 1kg 以内的按起步价…

vue上传文件夹+上传文件vue-simple-uploader

vue上传文件夹上传文件vue-simple-uploader 使用插件 在main.js引入 import uploader from vue-simple-uploaderVue.use(uploader);<el-dialog title"上传文件" :visible.sync"dialogFileVisible" width"50%" :before-close"handleFil…

《安富莱嵌入式周报》第334期:开源SEM扫描电子显微镜,自制编辑器并搭建嵌入式环境,免费产品设计审查服务,实用电子技术入门,USB资料汇总,UDS统一诊断

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1om411Z714/ 《安富莱嵌入式周报》第334期&#xff1a;开源SEM…

Primavera P6 – 从资源池中分配专属项目资源

前言 在使用P6的资源分配功能中&#xff0c;尝试使用 Primavera P6 的搜索功能来解决此问题仍然会导致每次尝试向活动添加资源时都会搜索单个资源。 这很费力&#xff0c;并不能节省太多的时间和精力。 这个简单、省时的技巧为使用 Primavera P6 的项目管理从业者提供了解决此…

前端之用HTML弄一个古诗词

将进酒 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>将进酒</title><h1><big>将进酒</big> 君不见黄河之水天上来</h1><table><tr><td ><img…

记一次特殊的渗透经历

起因 搞安全的小伙伴们应该知道&#xff0c;干我们这行老是会碰到一些奇奇怪怪的问题和需求&#xff0c;比如上次&#xff0c;某客户领导说让我给他找个会渗透的小伙子来&#xff0c;有个比较棘手的业务。我一听&#xff0c;心想&#xff1a;好嘛&#xff0c;这私活不就来了嘛…

python语音处理常见开源库介绍

在 Python 中&#xff0c;有几个著名的开源语音处理库&#xff0c;它们提供了丰富的工具和功能&#xff0c;用于处理和分析语音数据。以下是几个流行的 Python 语音处理库及其安装方法、特点和优势&#xff1a; 1. librosa 安装 pip install librosa特点 - **音频处理*…

【图像超分】论文精读:efficient sub-pixel convolutional neural network (ESPCN)

文章目录 前言Abstract1.Introduction1.1. Related Work1.2. Motivations and contributions 2. Method2.1. Deconvolution layer2.2. Efficient sub-pixel convolution layer 3. Experiments3.1. Datasets3.2. Implementation details3.3. Image super-resolution results3.3.…

羊大师揭秘,羊奶养生秘籍大公开

羊大师揭秘&#xff0c;羊奶养生秘籍大公开 羊奶&#xff0c;这个古老的营养佳品&#xff0c;近年来因其丰富的营养价值和独特的养生功效而受到越来越多人的青睐。今天&#xff0c;就让小编羊大师一起揭开羊奶养生的神秘面纱&#xff0c;让你每天都充满活力&#xff01; 一、…