CMake Tutorial Step1

2023-11-19

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;
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake Tutorial Step1 的相关文章

  • CMake - 将预构建库链接到 C# 项目

    我正在使用 CMake 构建 C 库 该库依赖于已构建的库 dll 我似乎无法让图书馆链接到我的图书馆 我尝试过使用target link libraries mylib external lib 我也尝试过暴力破解 reference e
  • 如何通过 Cmake 查找 iOS/mac OS X 框架

    Context 我通过此将 Boost C 库打包到一个框架 适用于 iOS 中script https github com davidandreoletti boostoniphone generic 该脚本产生boost框架 当链接到
  • 如何使用 --build 选项查看 cmake 发出的命令

    当我运行 cmake build target INSTALL 命令时 如何查看发出的命令 似乎没有像 versbose之类的选项 cmake 帮助说 cmake build 是底层构建工具的接口 但没有说明有关发出的命令转储的任何内容 我
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • cmake 包括其他目录中的 h 文件

    我在 cmake 项目下进行测试时遇到问题 我的项目是这样安排的 TerrainMap PointAccumulator heightQuadGrid Test 在 TerrainMap 目录中 CMakeLists txt 文件简单地概述
  • 在生成器表达式中使用 cmake 选项

    我想在生成器表达式中使用 cmake 选项 为了打开某个编译标志 来自文档 https cmake org cmake help v3 10 manual cmake generator expressions 7 html我不清楚如何实现
  • 针对 dll/lib 的 cmake 链接

    我的 cmake 的输出是一个静态库 我正在这样创建它 add library myMainLib STATIC BACKEND SOURCES 当我尝试让 myMainLib 链接到第三方 lib dll 时 出现了问题 dll 文件将在
  • 如何在使用 Cmake 构建期间编译 HLSL 着色器?

    我正在开发 d3d 应用程序 我想在使用 cmake 构建期间编译我的 hlsl 着色器 我不知道从哪里开始 这是我当前的 CMakeLists txt cmake minimum required VERSION 3 20 project
  • 使用星号更改多个源文件的 CMake 编译器标志

    我正在尝试调试与编译器优化相关的问题 O2 或以下版本没有问题 O3 出现段错误 并且我希望能够切换我的源代码块的编译器标志 以便我可以尝试缩小段错误的来源范围 我可以将全局优化级别设置为 O2 并更改单个文件的属性 如下所示 SET SO
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • 了解 CMake 背后的目的[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我试图理解 CMake 背后的目的 为什么它被设计成现在这样 以下是我想回答的一些问题 为什么CMake会生成生成文件 https e
  • 如何告诉 CMake 将构建文件放在哪里?

    我想告诉 CMake 将文件和文件夹输出到不同的文件夹而不是当前文件夹 我在下面讨论的是 CMake 生成的文件 文件 CMakeCache txt 目录 CMakeFiles 文件 生成文件 目录 bin 文件 cmake install
  • 带包装的 CMAKE RPATH

    我正在使用 cmake 创建包 我有以下结构 bin bin1 lib lib1 lib2 其中lib1和lib2是外部动态库 如何设置 RPATH 以便它自动与 lib1 和 lib2 链接 我也在这方面对 cmake 很感兴趣 Cmak
  • 将 cmake 与 nmake x64 一起使用

    我使用 cmake 生成 NMake 文件 一切正常 我使用 x64 工具集 没有 Visual Studio 只有 SDK 因此我输入 nmake 但它生成 x86 构建而不是 x64 构建 你知道为什么吗 以及如何强制 nmake 以
  • CMake第三方库安装

    我是编程新手 对于我的研究项目 我需要安装一个第三方库以便与 CMake 一起使用 GitHub项目 https github com cpp io2d P0267 RefImpl blob master BUILDING md 我在我的电
  • CMake GUI:指定 Windows 的库路径

    我正在编译一个基于 CMake 的项目 具体来说是 SOCI 它依赖于 SQLite 这是Windows 没有可供项目研究的标准路径 因此它找不到SQLite 我在配置时得到这个 SQLite3 not found some librari
  • 即使不在 Windows 上,生成器表达式也会将 WIN32 变量计算为 true

    我在 Ubuntu 上工作 这是我的 CMake 代码的一部分 有问题的部分在最后一句中 include ExternalProject ExternalProject Add fftw3 external URL http www fft
  • CMakeLists.txt:30(项目)处的 CMake 错误:找不到 CMAKE_C_COMPILER

    我正在尝试使用 CMake 制作 Visual Studio 解决方案来编译最新版本的 aseprite 并且 CMake 不断向我提供 No CMAKE C COMPILER could be found No CMAKE CXX COM
  • 在 CMake 中使用 -isystem 而不是 -I

    在使用 gcc 构建时 CMake 是否有任何方法可以强制通过 include directories 或者可能通过不同的函数 指定的路径使用 isystem 标志而不是 I 标志 See http gcc gnu org onlinedo

随机推荐

  • 【编译】gcc make cmake Makefile CMakeList.txt 关系、使用

    文章目录 一 关系 二 gcc 2 1 编译过程 2 2 编译参数 2 3 静态库和动态库 1 后缀名 2 联系与区别 2 4 GDB 调试器 1 常用命令 三 make makefile 四 cmake cmakelist 4 1 语法特
  • Android常用的加密算法

    一 MD5 MD5可以说是最基本最常用的加密算法了 还依稀记得在校招面试的时候被问到过 MD5信息摘要算法 MD5 Message Digest Algorithm 算法能将任意大小 格式的文字或文件进行加密从而产生 128 bit 16
  • 提高企业开发效率的优质工具:快速开发平台

    现代企业管理软件的功能越来越复杂 随着新技术作为管理手段不断被引入到管理软件中 使得管理软件的开发的难度在逐年的增加 尤其是企业需要的很多的功能都是个性化的 这让企业管理软件的开发少则半年 多则1年以上 而且失败率非常高 即使采用敏捷开发方
  • 使用 django-bootstrap3 库

    使用 django bootstrap3 库 1 配置 下载 pip install django bootstrap3 settings配置 在install apps中加上 bootstrap3 2 使用 在html文件中使用 表单 写
  • 如何的keil试试调试中,看逻辑分析仪Logic viwer

    在调试过程中 可以使用keil自带的逻辑分析仪查看变量的试试信息 减少串口输出 提高部分cpu的效率 可以添加以下信息 1 gpio引脚 2 全局变量 全局静态变量 局部变量是不行的 然后 添加变量后 需要右键设置 如下 g u32tick
  • el-table表格可拖拽实现

    druggerTable js function global factory global BmTableDrag factory global window function global function BmTableDrag op
  • win10系统镜像下载及在VMware虚拟机上创建win10虚拟机

    文章目录 前言 一 下载win10系统 二 配置win10系统虚拟机 创建新的虚拟机 注意事项 前言 网上很多win10镜像资源都没法用 不是下载不了 就是用不了 尤其公众号还有一堆套路 浪费自己很多时间 无奈 干脆自己做一个镜像 肯定好用
  • 【华为OD机试】数字游戏(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 小明玩一个游戏 系统发1 n张牌 每张牌上有一个整数 第一张给小明 后n张按照发牌顺序排成连
  • 数字化转型系列主题:数字化建设总体规划蓝图

    本文转自 CIO之家 数字化转型应该是千人千面 因为每家企业的难点痛点不一样 所以每家企业的转型路径都不尽相同 数字化转型不是为了转型而转型 必须是围绕解决企业最大痛点 以它做切入点 回报才最快 投入产出比才最高 所以常想 数字化转型第一件
  • 于仕琪的人脸检测算法

    于仕琪的人脸检测算法 对Windows下的商业使用也免费 刚更新了一次算法 正面人脸检测的角度范围从 40 40 度提升到 60 60 度 检测角度变大但计算量不增加 多视角人脸检测速度提升2倍 速度对比 在同样的条件下OpenCV 47
  • // 计算出给定矩阵中主对角线元素的和

    一 题目 计算出给定矩阵中主对角线元素的和 二 代码 include
  • 数据结构与算法学习总结(六)——字符串的模式匹配算法

    基本概念 字符串是一种特殊的线性表 即元素都是 字符 的线性表 字符是组成字符串的基本单位 字符的取值依赖于字符集 例如二进制的字符集为0 1 则取值只能为 0 1 再比如英语语言 则包括26个字母外加标点符号 例如 abcde 就是一个字
  • python遍历指定目录并打印层级结构

    import os def func filepath n 获取路径 files os listdir filepath for file in files 拼接路径 f d os path join filepath file 判断路径是
  • STM32CubeMX安装与使用

    STM32CubeMX 是 ST 公司近几年来大力推荐的STM32 芯片图形化配置工具 允许用户使用图形化向导生成C 初始化代码 支持多种工具链 比如MDK IAR TrueStudio等 可以大大减轻开发工作时间 提高开发效率 STM32
  • C++ Primer Plus 书之--C++ 模板类深究2--模板类和友元

    模板类和友元 模板类声明也可以有友元 模板的友元分为3类 1 非模板友元 2 约束模板友元 即友元的类型取决于类被实例化时的类型 3 非约束模板友元 即友元的所有具体化都是类的每一个具体化的友元 1 模板类的非模板友元函数 在模板类中将一个
  • 创建型模式,共五种

    设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可
  • scikit-image 0.17.2计算PSNR、SSIM、MSE

    版本及调用方式 scikit image 0 18 0之前版本的调用方式如下 from skimage measure import compare mse compare psnr compare ssim scikit image 0
  • 数字逻辑练习题(五) 分析下图所示组合逻辑电路的功能

    分析下图所示组合逻辑电路的功能 一 题目描述 分析下图所示组合逻辑电路的功能 要求 1 写出该电路输出 L1 L2 L3 的逻辑函数表达式 2 列出真值表 3 描述该电路的功能 二 题目解答 1 列出逻辑表达式 2 列出真值表 3 电路功能
  • 开发工程中遇到的BUG

    1 Couldn t communicate with a helper application in Xcode 7 问题一 Couldn t communicate with a helper application in Xcode
  • CMake Tutorial Step1

    CMake Tutorial Step1 参考资料 Step 1 A Basic Starting Point CMake 3 26 3 Documentation Tutorial工程 官方Tutorial工程 开发环境 CLion CM