cmake初识

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.hqwc.cn/news/535610.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣串题:验证回文串

笔者的代码与大佬的代码思路相同&#xff0c;但存在一个问题就是将字符串存到另一个数组中&#xff0c;存在strlen与sizeof&#xff0c;\0&#xff0c;进制转换等多种问题&#xff0c;判断也会出现部分问题&#xff0c;所以&#xff0c;尽量在原字符串上操作 bool isAlphanume…

Volatile与JMM

被Volatile修饰的变量有两大特点 可见性 有序性&#xff08;禁重排&#xff09; 如何保证的&#xff1f;内存屏障 Volatile的内存语义 当写一个Volatile变量的时候&#xff0c;JMM会把该线程对应的本地内存共享变量值立即刷新回主内存。 当读一个Volatile变量的时候&…

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏&#xff0c;显示游戏参数设置界面&#xff0c;用户输入参数后进入游戏界面&#xff0c;显示棋盘及双方博弈过程&#xff0c;游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏&#xff0c;可选择继续下…

案例分析篇09:Web架构设计相关20个考点(7~11)(2024年软考高级系统架构设计师冲刺知识点总结)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【单片机毕业设计7-基于stm32c8t6的智能温室大棚系统】

【单片机毕业设计7-基于stm32c8t6的智能温室大棚系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇7基于stm32的智能衣柜系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 ---------------…

Pytorch实战01——CIAR10数据集

目录 1、model.py文件 &#xff08;预训练的模型&#xff09; 2、train.py文件&#xff08;会产生训练好的.th文件&#xff09; 3、predict.py文件&#xff08;预测文件&#xff09; 4、结果展示&#xff1a; 1、model.py文件 &#xff08;预训练的模型&#xff09; impor…

分布式搜索elasticsearch(1)

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案…

识别恶意IP地址的有效方法

在互联网的环境中&#xff0c;恶意IP地址可能会对网络安全造成严重威胁&#xff0c;例如发起网络攻击、传播恶意软件等。因此&#xff0c;识别恶意IP地址是保护网络安全的重要一环。IP数据云将探讨一些有效的方法来识别恶意IP地址。 IP地址查询&#xff1a;https://www.ipdata…

RPC基础知识回顾

RPC基础知识回顾 1、先认识一下大家熟悉的HTTP 大家都了解HTTP吧。相信项目中也用过一些。 比如: JDK自带的老旧的HttpURLConnection&#xff0c;封装写的很累,java8之前基于HTTP1.0。在java9开始支持Http2.0Spring的其中RestTemplate都是基于HTTP/1.1的请求。最新的还有Sp…

OceanBase中binlog service 功能的试用

OBLogProxy简介 OBLogProxy即OceanBase的增量日志代理服务&#xff0c;它可与OceanBase建立连接并读取增量日志&#xff0c;从而为下游服务提供了变更数据捕获&#xff08;CDC&#xff09;的功能。 关于OBLogProxy的详尽介绍与具体的安装指引&#xff0c;您可以参考这篇官方OB…

离散系统描述模型及其转换

离散系统描述模型及其转换 常用离散模型 \textbf{常用离散模型} 常用离散模型系统传递函数模型 t f \bf{tf} tf零-极点增益模型 z p k \bf{zpk} zpk极点留数模型 r p k \bf{rpk} rpk二次分式模型 s o s \bf{sos} sos状态变量模型 s s \bf{ss} ss 例题 常用离散模型 \textbf{常用…

Arrays.asList转换为List集合后使用add方法抛出UnsupportedOperationException

问题场景&#xff1a; 将String[] 数组转为 List集合&#xff0c;后对list集合进行添加删除报UnsupportedOperationException 百度原因&#xff1a; Arrays.asList返回的集合不支持元素的添加和删除&#xff08;不支持add、addAll、remove方法&#xff09;&#xff0c;否则抛出…