CMake Tutorial Step1

news2024/12/26 11:24:49

CMake Tutorial Step1

参考资料:Step 1: A Basic Starting Point — CMake 3.26.3 Documentation

Tutorial工程:官方Tutorial工程

开发环境:CLion

CMake简介

方便起见直接问New Bing。

在这里插入图片描述

为什么要学习CMake?

CMake的最大特点和Qt一样,跨平台工具,因此学习它可以应用在大多数场合,投入产出比很高。

步骤一:一个基础的起点

本章一共3个练习,分别用于实现3个目标:

  • 练习1:构建一个基础的工程
  • 练习2:指定C++标准版本
  • 练习3:增加一个软件版本号和配置头文件

练习1:构建一个基础的工程

背景:

假如现在你想练习C++编程,但是不想使用Visual Studio或Qt Creator这样的图像化集成工具。

目标:

理解如何创建一个简单的CMake工程。

辅助资源:

add_executable()
cmake_minimum_required()
project()

需要编辑的文件:

CMakeLists.txt

解决方案

# TODO 1: Set the minimum required version of CMake to be 3.10
cmake_minimum_required(VERSION 3.25)

# TODO 2: Create a project named Tutorial
project(Tutorial)

# TODO 3: Add an executable called Tutorial to the project
# Hint: Be sure to specify the source file as tutorial.cxx
add_executable(Tutorial tutorial.cxx)

cmake_minimum_required:指定cmake至少应该是某个版本以上

project:指定工程名字,相当于创建一个工程

add_executable:指定可执行文件的名字以及生成它的源文件

提示:上面三行是所有CMake工程都要有的,其中 add_executable 在实际工程中指定的源文件会是成百上千个,因此后面多半会被替换成变量,变量中包含工程中所有需要用到的源文件。

练习2:指定C++标准版本

背景:

假如现在你已经把最古老的C++ 98学习完了,现在想继续学习C++ 11,17,20等更新的标准。

目标:

增加C++11特性,使工程可以使用新标准的语法。

辅助资源:

CMAKE_CXX_STANDARD
CMAKE_CXX_STANDARD_REQUIRED
set()

需要编辑的文件:

CMakeLists.txttutorial.cxx

解决方案

  1. 先在 tutorial.cxx 文件中使用C++ 11的语法,此时如果你编译它会报错
// convert input to double
// TODO 4: Replace atof(argv[1]) with std::stod(argv[1])
const double inputValue = std::stod(argv[1]);
  1. 删除 tutorial.cxx 文件中的这一行,因为原先的 atof(argv[1]) 不用了
#include <cstdlib> // TODO 5: Remove this line
  1. CMakeLists.txt 中添加这两行,明确告诉CMake要用C++ 11来构建工程
# TODO 6: Set the variable CMAKE_CXX_STANDARD to 11
#         and the variable CMAKE_CXX_STANDARD_REQUIRED to True
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

提示:需要注意的是 set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_STANDARD_REQUIRED True) 这两行需要放在 add_executable(Tutorial tutorial.cxx) 上面

练习3:增加一个软件版本号和配置头文件

背景:

软件工程上一般都会给软件分配一个版本号,用于版本管理和缺陷追溯等功能。CMake可以使这个过程变得很方便。

目标:

定义和输出软件版本号。

辅助资源:

<PROJECT-NAME>_VERSION_MAJOR
<PROJECT-NAME>_VERSION_MINOR
<PROJECT-NAME>_VERSION_PATCH
<PROJECT-NAME>_VERSION_TWEAK
configure_file()
target_include_directories()

需要编辑的文件:

CMakeLists.txttutorial.cxx

解决方案

  1. project() 指定工程名时,指定 VERSION 版本号

    # TODO 7: Set the project version number as 1.0 in the above project command
    project(Tutorial VERSION 1.2.3.4)
    
  2. configure_file() 指令将指定的版本号从TutorialConfig.h.in复制进TutorialConfig.h中

    # TODO 8: Use configure_file to configure and copy TutorialConfig.h.in to
    #         TutorialConfig.h
    configure_file(TutorialConfig.h.in TutorialConfig.h)
    

    提示:当前版本号只在 CMakeLists.txt 中有指定,TutorialConfig.h.in 如何能知道版本号呢?TutorialConfig.h.in 中一定需要编写一些内容,使其获得版本号

  3. 让工程包含 TutorialConfig.h 所在的头文件路径

    # TODO 9: Use target_include_directories to include ${PROJECT_BINARY_DIR}
    target_include_directories(Tutorial PUBLIC ${PROJECT_BINARY_DIR})
    
  4. TutorialConfig.h.in 文件中编写内容,使其可以获得 CMakeLists.txt 中指定的版本号

    // the configured options and settings for Tutorial
    // TODO 10: Define Tutorial_VERSION_MAJOR and Tutorial_VERSION_MINOR
    #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
    #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
    #define Tutorial_VERSION_PATCH @Tutorial_VERSION_PATCH@
    #define Tutorial_VERSION_TWEAK @Tutorial_VERSION_TWEAK@
    
  5. tutorial.cxx 文件中包含 TutorialConfig.h 头文件

    // TODO 11: Include TutorialConfig.h
    #include "TutorialConfig.h"
    
  6. tutorial.cxx 中输出版本号

    if (argc < 2) {
        // TODO 12: Create a print statement using Tutorial_VERSION_MAJOR
        //          and Tutorial_VERSION_MINOR and Tutorial_VERSION_PATCH
        //			and Tutorial_VERSION_TWEAK
        std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
                  << Tutorial_VERSION_MINOR << "." << Tutorial_VERSION_PATCH
                  << "." << Tutorial_VERSION_TWEAK << std::endl;
        std::cout << "Usage: " << argv[0] << " number" << std::endl;
        return 1;
    }
    

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

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

相关文章

微服务---分布式搜索引擎 elasticsearch基础

分布式搜索引擎 elasticsearch基础 0.学习目标 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitH…

centos7操作yum命令失败

前言设置网卡开机自动启动设置国内dns服务器系统修改CentOS-Base.repo中的地址 前言 刚安装完的CentOS7的系统&#xff0c;发现无法使用yum命令进行更新&#xff0c;在更新的时候会出现下面这种内容&#xff0c;为此问题有以下这些解决方案可以尝试。 One of the configured r…

两段视频合成一个视频用什么软件 怎么把两段视频合成一段看不出来

两段视频合成一个视频用什么软件&#xff1f;无论是两段视频的合成&#xff0c;还是三段视频的合成&#xff0c;用视频编辑软件都能轻松搞定。但怎么把两段视频合成一段看不出来&#xff1f;这就比较考验制作者的功力了&#xff0c;不过我们还是有捷径的&#xff0c;下面一起来…

new和delete

目录 malloc: 开辟失败&#xff1a;返回值为空指针 new: 内置类型&#xff1a; 申请一个int对象&#xff08;开辟一块存储int类型数据的空间&#xff0c;只能存储一个int数据&#xff09;&#xff1a; 申请5个int对象&#xff08;开辟一块存储int类型数据的空间&#xff…

Blender3.5 边的操作

目录 1. 边操作1.1 边的细分 Subdivide1.2 边的滑移 Edge Slide1.3 边的删除1.4 边的溶解 Dissolve1.5 边线倒角 Bevel1.6 循环边 Loop Edges1.7 并排边 Ring Edges1.8 桥接循环边 1. 边操作 1.1 边的细分 Subdivide 在边选择模式&#xff0c;选中一条边&#xff0c;右键&…

JVM系列(十一) 垃圾收集器之 Concurrent Mark Sweep 并发标记清除

垃圾收集器之 Concurrent Mark Sweep 并发标记清除 上几篇文章我们讲解了单线程垃圾收集器 Serial/SerialOld ,多线程垃圾收集器 Parallel Scavenge/Old, 本文我们讲解下 Concurrent Mark Sweep 简称CMS垃圾收集器 垃圾收集器 新生代收集器&#xff1a; Serial、ParNew、Par…

图解 | 原来这就是网络

​​ 你是一台电脑&#xff0c;你的名字叫 A 很久很久之前&#xff0c;你不与任何其他电脑相连接&#xff0c;孤苦伶仃。 ​ 直到有一天&#xff0c;你希望与另一台电脑 B 建立通信&#xff0c;于是你们各开了一个网口&#xff0c;用一根网线连接了起来。 ​ 用一根网线连接起来…

[晕事]今天做了件晕事7

今天在使用iptables与grep的时候碰到一件晕事&#xff1b; 第一步添加了一条rule到OUTPUT&#xff1a; iptables -A OUTPUT --source 10.87.51.2 --destination 10.87.51.10 -p tcp --sport 5060 -j DROP 第二步使用&#xff1a;iptables -nL | grep DROP 发现这条记录跑到了FO…

玩转ESP32 PWM输出,制作炫酷呼吸灯效果

文章目录 什么是PWM软硬件使用ESP32实现PWM输出代码讲解结语 什么是PWM PWM&#xff08;Pulse Width Modulation&#xff09;是一种常用的模拟信号产生技术&#xff0c;它通过对一个定时器的计数值进行调整来改变输出信号的占空比&#xff0c;从而控制输出信号的平均电压值&am…

idea使用 ( 二 ) 创建java项目并导入依赖jar

3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…

Spring Boot集成ShardingSphere实现数据分片(一) | Spring Cloud 40

一、背景 传统的将数据集中存储至单一节点的解决方案&#xff0c;在性能、可用性和运维成本这三方面已经难于满足海量数据的场景。 从性能方面来说&#xff0c;由于关系型数据库大多采用 B 树类型的索引&#xff0c;在数据量超过阈值的情况下&#xff0c;索引深度的增加也将使…

Mail 邮件服务

~ Postfix ~ sdskill.com 的邮件发送服务器 ~~ 支持smtps(465)协议连接,使用Rserver颁发的证书,证书路径/CA/cacert.pem ~ 创建邮箱账户“user1~user99”(共99个用户),密码为Chinaskill20!; ~ Dovecot ~ sdskill.com 的邮件接收服务器; ~ 支持imap…

6.微服务项目实战---Sleuth--链路追踪

6.1 链路追踪介绍 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多模块。这些模块负责不同的功能&#xff0c;组合成 系统&#xff0c;最终可以提供丰富的功能。在这种架构中&#xff0c;一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上…

Docker compose-实现多服务、nginx负载均衡、--scale参数解决端口冲突问题

Docker compose-实现多服务、nginx负载均衡、--scale参数解决端口冲突问题 问题&#xff1a;scale参数端口冲突解决方法&#xff1a;nginx实现多服务、负载均衡修改docker-compose.yml配置新增nginx本地配置文件验证启动容器查看容器状态访问web应用 问题&#xff1a;scale参数…

《二》HTTP 请求报文和响应报文、请求方法、状态码

请求报文和响应报文&#xff1a; 请求报文: 客户端向服务器发送的请求信息&#xff0c;就叫做请求报文。 客户端发送一个 HTTP 请求到服务器&#xff0c;请求信息包含四部分&#xff1a;请求行、请求头、空行、请求体。 请求行&#xff1a;包含三部分&#xff0c;分别是请…

查看库文件是32位还是64位|查看lib是静态库还是导入库|判断是debug模式还是release模式

文章目录 dll位数查看lib位数查看查看lib库是静态库还是导入库dll库文件信息查看lib库文件内容查看dll库查看编译模式是debug还是release方法一方法二方法三 lib静态库查看编译模式是debug还是release方法一方法二 lib导入库查看编译模式是debug还是release查看Linux下的.a库&a…

ROS学习第十五节——常用API(C++)

由于时间问题&#xff0c;从这一节开始只记录C实现效果&#xff0c;加油 以下附上这一节调试用的程序 https://download.csdn.net/download/qq_45685327/87708069 1.初始化函数 void init(int &argc, char **argv, const std::string& name, uint32_t options 0); …

openEuler NFS+协议全新发布:实现NAS存储性能与可靠性倍增

4月21日&#xff0c;在openEuler Developer Day 2023上&#xff0c;openEuler发布NFS协议&#xff0c;实现单客户端访问NAS存储可靠性提升3倍、性能提升6倍&#xff0c;助力NAS存储全面满足新型生产核心场景下苛刻要求。 传统NFS面临挑战 网络文件系统&#xff08;NFS&#xf…

vue打包如何开启gzip压缩

文章目录 场景gzip压缩有两种方案&#xff1a;个人实践 场景 本人前端打包的js达到了6.9M,导致网站加载很慢&#xff0c;想了下可以用gzip的方式压缩&#xff0c;减少文件大小。 “前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c…

什么蓝牙耳机好?测评达人精选五款性价比高蓝牙耳机推荐

用蓝牙耳机听歌、刷视频、玩游戏已经成为趋势&#xff0c;有线耳机已经逐渐被取代&#xff0c;但蓝牙耳机价格跨度大&#xff0c;品牌和型号也非常多&#xff0c;究竟什么蓝牙耳机好&#xff1f;我作为测评员这几年已经体验过五十款蓝牙耳机&#xff0c;今天就来总结五款性价比…