【C++】8.编译:CMake工具入门

                          😏*★,°*:.☆( ̄▽ ̄)/$:*.°★* 😏
                          这篇文章主要介绍CMake工具的入门使用。

————————————————学其所用,用其所学。——梁启超—————————————————

                        欢迎来到我的博客,一起学习知识,共同进步。

                       🥞喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. CMake工具介绍
    • :blush:2. CMake安装与使用
    • Windows安装CMake:
    • Linux安装CMake:
    • :satisfied:3. CMake语法说明
      • 1. 构建类型
      • 2. 注释、输出、大小写等
      • 3. 布尔值
      • 4. 常用命令
      • 5. CMakeLists.txt示例

😏1. CMake工具介绍

CMake是一个跨平台的自动化构建(编译)工具,用于管理、生成和测试软件项目。它使用类似Make的语法来描述构建过程,并提供了一种简单的方式来跨多个操作系统(Win、Linux)和编译器(MinGW、gcc)生成可执行文件、库和安装包。CMake支持各种编程语言,包括C、C++、Java等,可以在Linux、Windows、Mac OS X等多种平台上使用。

CMake通过CMakeLists.txt文件来描述项目的构建过程,其中包含项目名称、源文件列表、目标类型、依赖项等信息。CMake可以生成MakefileVisual Studio项目文件等,使开发人员可以在不同的平台和编译器上使用相同的配置文件进行构建。

除了构建之外,CMake还提供了测试框架(搭配gtest)、打包功能(搭配nsis)、安装规则等功能,帮助开发人员更方便地管理和部署他们的软件项目。

😊2. CMake安装与使用

官网:https://cmake.org/

Windows安装CMake:

下载链接:https://github.com/Kitware/CMake/releases/download/v3.26.3/cmake-3.26.3-windows-x86_64.msi

Linux安装CMake:

# 更新软件列表
sudo apt-get update
# 安装
sudo apt-get install cmake
# 验证版本
cmake --version

对于一个配置好的CMake项目来说,从命令行生成工程文件是很简单的,一般步骤如下:

# 创建build目录
mkdir build && cd build
# 生成Makefile
cmake ..  # (Windows-MinGW)cmake -G "MinGW Makefiles" ..
# 编译
make
# 生成可执行文件

😆3. CMake语法说明

1. 构建类型

可以指定的构建类型有:Debug、Release、MinSizeRel、RelWithDebInfo。使用示例:

cmake -DCMAKE_BUILD_TYPE=Debug

2. 注释、输出、大小写等

注释用#,大小写不分,用message来输出信息,用set()来定义变量,用math()来进行数学计算。

3. 布尔值

表示False的有:OFF、FALSE、N、NO、0、”“(空字串)、没被指派值的变量、NOTFOUND、任何结尾是 -NOTFOUND 的字串

表示TRUE的有:ON、TRUE、Y、YE、YES、1、其他不归类为 FALSE 的字串

4. 常用命令

指定项目名称:project(Main)

指定需要的CMake的最低版本:cmake_minimum_required(VERSION 2.8)

用于将 dir 目录下的所有源文件的名字保存在变量 variable 中:aux_source_directory(. DIR_SRCS)

用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为 name:add_executable(Main ${DIR_SRCS})

用于指定从一组源文件 source1 source2 … sourceN 编译出一个库文件且命名为name:add_library(Lib ${DIR_SRCS})

用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。这里的目标必须add_executable、 add_library、 add_custom_target 命令创建的目标:add_dependencies(target-name depend-target1 depend-target2 …)

用于添加一个需要进行构建的子目录:add_subdirectory(Lib)

用于指定 target 需要链接 item1 item2 …。这里 target 必须已经被创建, 链接的item 可以是已经存在的 target(依赖关系会自动添加):target_link_libraries(Main Lib)

用于设定变量 variable 的值为 value。如果指定了 CACHE 变量将被放入 Cache(缓存)中:set(ProjectName Main)

用于移除变量 variable。如果指定了 CACHE 变量将被从 Cache 中移除:unset(VAR CACHE)

载入预定义的 cmake 模块:INCLUDE(module [OPTIONAL])

用于设定目录, 这些设定的目录将被编译器用来查找 include 文件:include_directories(${PROJECT_SOURCE_DIR}/lib)

5. CMakeLists.txt示例

示例一:

project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})

示例二:

project(HELLO)
set(LIB_SRC hello.c)
set(APP_SRC main.c)
add_library(libhello ${LIB_SRC})
add_executable(hello ${APP_SRC})
target_link_libraries(hello libhello)

在这里插入图片描述

以上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端客栈】使用CSS实现畅销书排行榜页面

📬📫hello,各位小伙伴们,我是小浪。大家都知道,我最近是在更新各大厂的软件测试开发的面试真题,也是得到了很大的反馈和好评,几位小伙伴也是成功找到了测开的实习,非常不错。如果能前…

Java的线程

介绍线程 线程是系统调度的最小单元,一个进程可以包含多个线程,线程是负责执行二进制指令的。 每个线程有自己的程序计数器、栈(Stack)、寄存器(Register)、本地存储(Thread Local&#xff09…

Git常用命令rebase

Git常用命令rebase 1、git常用命令rebase rebase 会把你当前分支的 commit 放到公共分支的最后面,所以叫变基,就好像你从公共分支又重新拉出来这个 分支一样。 例如如果你从 master 拉了个 feature 分支出来,然后你提交了几个 commit&…

【C++】YY带你手把手掌握C++系列 (P2)未完结

前言 大家好,这里是YY的带你手把手掌握C系列。大部分知识点都含有【特性介绍】【使用场景】【注意要点】【易混淆点】【代码演示】【画图演示】由于C体系之庞大,所以该系列以分P形式更新!本篇博客为P2! 大家可以通过本篇博客查找C…

【鲁棒优化、机会约束】具有分布鲁棒联合机会约束的能源和储备调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

项目实现读写分离操作(mysql)

读写分离 1.问题说明 2.读写分离 Master(主库)----(数据同步)—> Slave(从库) Mysql主从复制 mysql主从复制 介绍 mysql主从复制是一个异步的复制过程,底层是基于mysql数据库自带的二进制日志功能。就是一台或多台…

算法套路十七——买卖股票问题:状态机 DP

算法套路十七——买卖股票问题:状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机(Finite State Machine)的问题求解方法。 状态机DP(State Machine DP)是一种动态规划的思想,它通常用于解决一些具…

如何应用金字塔模型提高结构化表达能力

看一下结构化表达的定义: 结构化表达:是基于结构化思维,理清事物整理与部分之间关系、换位思考后,进行简洁、清晰和有信服力的表达,是一种让受众听得明白、记得清楚、产生认同的精益沟通方式。 结构化表达的基本原则是…

总结如何申请注册 GitHub 教师教育优惠 Benefits for Teachers 来免费使用 copilot

目录 1. GitHub 教师教育优惠有什么2. 如何申请教师教育优惠呢2.1 选择学校2.2 更改个人信息2.3 准备证明材料2.4 提交申请2.5 遇到的问题2.5.1 问题 12.5.2 问题 22.5.3 问题 3 3. 申请免费的 GitHub Copilot 学生注册不在此处赘述了,网上有很多教程可以参考。但是…

前端BFC

一、首先我们要先了解常见的定位方案,总共3种(普通流、浮动、绝对定位) 而BFC是属于普通流的 我们可以把BFC看作为页面的一块渲染区域,他有着自己的渲染规则 简单来说BFC可以看作元素的一种属性,当元素拥有了BFC属性…

Python os模块详解

1. 简介 os就是“operating system”的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页也可以极大增强代码的可移植性。如果该模块中相…

二叉堆讲解

二叉堆讲解 大顶堆和小顶堆 从二叉堆的结构说起,它是一棵二叉树,并且是完全二叉树,每个结点中存有一个元素(或者说,有个权值)。 堆性质:父亲的权值不小于儿子的权值(大根堆&#x…

什么是JS事件流

什么是JS事件流? 一&#xff1a;事件冒泡 <!DOCTYPE html> <html lang"en"> <head><title>事件冒泡例子</title> </head> <body><div id"box">点击我</div> </body> </html>上述的代…

利用暴力攻击破解登陆密码

长久以来&#xff0c;入侵远程计算机系统的工具和技术并没有发生翻天覆地的变化。例如&#xff0c;在许多情况下&#xff0c;普通用户只要知道了相关密码&#xff0c;就能立刻变身为管理员。虽然这些情形听起来不够曲折&#xff0c;但在大多数情况下&#xff0c;暴力攻击是通过…

css3 flex弹性布局详解

css3 flex弹性布局详解 一、flexbox弹性盒子 2009年&#xff0c;W3C 提出了一种新的方案----Flex 布局&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前&#xff0c;它已经得到了所有浏览器的支持&#xff0c;这意味着&#xff0c;现在就能很安全地使用这项功能。…

【一起啃书】《机器学习》第五章 神经网络

文章目录 第五章 神经网络5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 全局最小与局部极小5.5 其他常见神经网络5.6 深度学习 第五章 神经网络 5.1 神经元模型 神经网络是由具有适应性简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统…

生产流程图怎么制作?思路提供

生产流程图是一种图表&#xff0c;用来展示生产流程中的各个环节及其顺序。这种图表可以帮助企业管理者更好地了解生产过程中的各个环节&#xff0c;从而更好地进行管理和优化。生产流程图通常包括各个生产环节的名称、所需时间、参与人员、设备和工具等信息。 在制作生产流程图…

七大软件架构设计原则详解

目录 1、概述 2、七大设计原则 2.1、开闭原则 2.2、里氏替换原则 2.3、依赖倒置原则 2.4、单一职责原则 2.5、接口隔离原则 2.6、迪米特法则 2.7、合成复用原则 3、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&…

基于jdk1.8的Java服务监控和性能调优

JVM的参数类型 X参数 非标准参数-Xint: 解释执行-Xcomp: 第一次使用就编译成本地代码-Xmixed: JVM自己来决定是否编译成本地代码 默认使用的是mixed mode 用的不多, 只需要做了解, 用的比较多的是XX参数 XX参数 非标准化参数相对不稳定主要用来JVM调优和Debug Boolean: …

【Vue3+TS项目】硅谷甄选day02--后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 n…