CMake 官方文档入门

news2024/11/16 13:26:15

对比官方文档练习

step1 基本起始点

一个基本的项目:从源文件构建可执行程序

文件目录如下

请添加图片描述

编写 CMakeLists.txt 如下:

# cmake 要求的最小版本
cmake_minimum_required(VERSION 3.24)
# 设置项目名称 可以设置版本号
project(Tutorial VERSION 1.0)
# 设置 c++ 的语言标准 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

configure_file(TutorialConfig.h.in TutorialConfig.h)

# 添加可执行程序(前面的是可执行程序的名称 后面是所需要的 source 文件)
add_executable(Tutorial tutorial.cpp)

target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")

解释:

  • 函数

  • configure_file():官方CMake教程对它的解释是:将文件复制到另一个位置并修改其内容。当然,这里的修改其内容也不是任意地修改,也是遵循一定的规则:将input文件复制到output文件,并在输入文件内容中的变量,替换引用为@VAR@或 V A R 的 变 量 值 。 每 个 变 量 引 用 将 替 换 为 该 变 量 的 当 前 值 , 如 果 未 定 义 该 变 量 , 则 为 空 字 符 串 。 可 能 有 些 绕 头 , 再 浅 显 一 点 : c o n f i g u r e f i l e , 复 制 一 份 输 入 文 件 到 输 出 文 件 , 替 换 输 入 文 件 中 被 @ V A R @ 或 者 {VAR}的变量值。每个变量引用将替换为该变量的当前值,如果未定义该变量,则为空字符串。可能有些绕头,再浅显一点:configure_file,复制一份输入文件到输出文件,替换输入文件中被@VAR@或者 VARconfigurefile@VAR@{VAR}引用的变量值。也就是说,让普通文件,也能使用CMake中的变量。

    configure_file(<input> <output>
                   [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
                   [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
    
    
  • target_include_directories():指定目标包含的头文件路径

  • 内置变量

  • PROJECT_BINARY_DIR:全路径/build

  • PROJECT_SOURCE_DIR:全路径/代码在的地方

  • CMAKE_CXX_STANDARD_REQUIRED:可以为每个 Target 初始化 CXX_STANDARD_REQUIRED 属性。而 CXX_STANDARD_REQUIRED 存在的目的是如果用户没有对自己的 CXX_STANDARD 作出宣告的话,那它就会死——但 set(CMAKE_CXX_STANDARD 17) 可以令这些措施一律无意义。这是为了能够对编译器的C++标准兼容性进行更好的约束,但对绝大多数人来说毫无意义。

tutorial.cpp 如下

// Copyright (c) 2022 Xiguan Inc
// Author: xiguan
// Email: xiguan.teng@qq.com
// Create on 22-12-2
// TODO:
//

#include <cmath>
#include <iostream>

#include "TutorialConfig.h"

using namespace std;

int main(int argc, char *argv[]) {
  if (argc < 2) {
    cout << argv[0] << "Version " << Tutorial_VERSION_MAJOR << "."
         << Tutorial_VERSION_MINOR << endl;

    cout << "Usage: " << argv[0] << " number" << endl;
    return 1;
  }

  const double inputValue = ::std::stod(argv[1]);

  const double outputValue = ::sqrt(inputValue);

  cout << "The square root of " << inputValue << " is " << outputValue << endl;
  return 0;
}

TutorialConfig.h.in 如下:

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

step2 添加库

现在给项目添加库(library),在库中实现平方根函数

文件目录结构如下:

请添加图片描述

编写顶层 CMakeLists.txt 如下:

# cmake 要求的最小版本
cmake_minimum_required(VERSION 3.10)
# 设置项目名称 可以设置版本号
project(Tutorial VERSION 1.0)
# 设置 c++ 的语言标准 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

configure_file(TutorialConfig.h.in TutorialConfig.h)
# 设置 MyFunctions 可选
option(USE_MYMATH "Use tutorial provided math implementation" ON)

if (USE_MYMATH)
    add_subdirectory(MathFunctions)
    list(APPEND EXTRA_LIBS MathFunctions)
    list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
endif ()

## 添加库
#add_subdirectory(MathFunctions)


# 添加可执行程序(前面的是可执行程序的名称 后面是所需要的 source 文件)
add_executable(Tutorial tutorial.cpp)

target_link_libraries(Tutorial PUBLIC "${EXTRA_LIBS}")

target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" "${EXTRA_INCLUDES}")

# target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/MathFunctions")
# 链接这个库
# target_link_libraries(Tutorial PUBLIC MathFunctions)

解释:

  • 函数

  • option:用于控制编译流程,相当于C语言中的宏条件编译

    option(<variable> "<help_text>" [value])
    

    variable:定义选项名称;help_text:说明选项的含义;value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF。

  • target_link_libraries:将之前打包的库,链接到生成的目标上,不然会出现光声明,没定义的错误,注意也可以直接指定库名,如target_link_libraries(main XXX.so)target_link_libraries(main XXX.a)

  • add_subdirectory:添加一个子目录并构建该子目录

    add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    

    source_dir
    必选参数。该参数指定一个子目录,子目录下应该包含CMakeLists.txt文件和代码文件。子目录可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前目录的一个相对路径。

    binary_dir
    可选参数。该参数指定一个目录,用于存放输出文件。可以是相对路径也可以是绝对路径,如果是相对路径,则是相对当前输出目录的一个相对路径。如果该参数没有指定,则默认的输出目录使用source_dir

    EXCLUDE_FROM_ALL
    可选参数。当指定了该参数,则子目录下的目标不会被父目录下的目标文件包含进去,父目录的CMakeLists.txt不会构建子目录的目标文件,必须在子目录下显式去构建。例外情况:当父目录的目标依赖于子目录的目标,则子目录的目标仍然会被构建出来以满足依赖关系(例如使用了target_link_libraries)

  • list:

    list (subcommand <list> [args...])
    

    subcommand为具体的列表操作子命令,例如读取查找修改排序等。<list>为待操作的列表变量,[args...]为对列表变量操作需要使用的参数表,不同的子命令对应的参数也不一致。

编写 MathFunctions CMakeLists.txt 如下

# 生成库
add_library(MathFunctions mysqrt.cpp)

解释:

  • 函数
  • 将指定的一些源文件打包成动态库和静态库,第一个参数就是生成库的名字,第二个参数是生成库的类型,后面的参数就都是源文件了,可以是之前定义的列表,也可以用1.cpp 2.cpp 3.cpp去指定。

tutorial.cpp 如下

// Copyright (c) 2022 Xiguan Inc
// Author: xiguan
// Email: xiguan.teng@qq.com
// Create on 22-12-2
// TODO:
//

#include <cmath>
#include <iostream>

#include "TutorialConfig.h"
#ifdef USE_MYMATH
#include "MathFunctions.h"
#endif

using namespace std;

int main(int argc, char *argv[]) {
  if (argc < 2) {
    cout << argv[0] << "Version " << Tutorial_VERSION_MAJOR << "."
         << Tutorial_VERSION_MINOR << endl;

    cout << "Usage: " << argv[0] << " number" << endl;
    return 1;
  }

  const double inputValue = ::std::stod(argv[1]);
#ifdef USE_MYMATH
  const double outputValue = mysqrt(inputValue);
#else
  const double outputValue = ::sqrt(inputValue);
#endif
  cout << "The square root of " << inputValue << " is " << outputValue << endl;
  return 0;
}

TutorialConfig.h.in 如下:

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

#cmakedefine USE_MYMATH

MathFunctions 目录

这个目录的文件就是自己实现了一下 mysqrt 这个函数

step3 为库添加使用要求

使用要求库对库和可执行程序的链接,包含命令行提供了更好的控制,也使 CMake 内传递目标属性更加可控

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

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

相关文章

【Docker】本地镜像与私有库:发布、拉取,图文展示全过程

Docker是基于Go语言实现的云开源项目。Docker的主要目标是**“Build&#xff0c;Ship and Run Any App,Anywhere”**。也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&#xff08;可以是一个WEB应用或数据库应用等等&#xff09;及其运…

Linux环境MySQL数据库主从复制保姆级教程

文章目录1、环境准备1.1、安装MySQL1.2、设置root登录密码2、主库配置2.1、修改my.cnf2.2、重启数据库2.3、检验设置是否成功2.4、建立主从复制的账号3、从库配置3.1、配置my.cnf3.2、配置复制参数3.3、查看从库状态4、测试5、注意事项5.1、接口放行5.2、防火墙关闭5.3、Slave_…

Android Framework的框架描绘~

前言 写在前面&#xff1a; 1、有没有必要学习linux内核&#xff1f; 我认为是很有必要的。学习linux内核有助于我们加深对一些概念的理解&#xff0c;比如“进程”、“线程”。 2、有没有必要自己编译android源码&#xff1f; 非必须&#xff0c;可以直接用android studio查看…

【图表利剑】开发复杂Echarts时,visualMap视觉组件中属性seriesIndex必须用起来

一、背景 据说90%的可视化是用Echarts开发&#xff0c;没错&#xff0c;笔者也没例外&#xff0c;在新的开发项目中&#xff0c;遇到了这个开发神器Echarts&#xff0c;想要的功能就是在省份上显示动态效果图&#xff0c;比如涟漪。原来的功能已有范围视觉组件visualMap。 二…

【Matplotlib绘制图像大全】(十九):Matplotlib绘制等高线

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

SAP ABAP——数据类型(四)【TYPE系列关键字】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

gitHub不能用密码推送了,必须要使用令牌

有一段时间没使用github去push项目了&#xff0c;今天push之后&#xff0c;根据提示输入账号密码&#xff0c;但是失败了&#xff0c;报错如下&#xff1a; support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com…

【Swin Transformer原理和源码解析】Hierarchical Vision Transformer using Shifted Windows

目录前言一、动机和改进点二、整体架构&#xff1a;SwinTransformer三、输入设置&#xff1a;PatchEmbed四、4个重复的Stage&#xff1a;BasicLayer4.1、SwinTransformerBlock4.1.1、创建mask4.1.2、shift特征4.1.3、为shift后的特征划分窗口4.1.4、W-MSA VS SW-MSA4.2、PatchM…

Android APP 停止运行报错弹窗

一个APP经常性的报错,然后就会弹出一个"很抱歉,xxx已停止运行"这样的弹窗,在Android系统层临时将这个弹窗屏蔽.弹窗如下: 在没做过此类修改之前,不知到如何下手的情况下,请做如下几步: 在Android目录下全局搜索关键字"很抱歉",然后会有一个路径frameworks…

ICS计算系统概论实验3—LC3汇编代码实现最长重复子字符串Longest-duplicate-substring

Lab03 Longest-duplicate-substring Purpose 子字符串是字符串中至少出现一次的连续字符序列。重复子字符串是一种由相同字符组成的子字符串。例如&#xff0c;“aabbbc”的重复子字符串是“aa”&#xff0c;“bbb”和“c”。 给定一个字符串及其长度&#xff0c;计算出它最长…

全球DTC品牌纷纷奔走线下,价值岂止于用户体验和品牌形象

走向线下&#xff0c;开设新零售门店/旗舰店/体验店/快闪店&#xff0c;已成为很多全球品牌的共同做法&#xff1a;从海外巨头亚马逊的Amazon go、国内的盒马O2O&#xff0c;到DTC经典品牌的Warby Parker、Allbirds们遍地开花的线下实体店&#xff0c;是什么让全球DTC品牌纷纷走…

【Matplotlib绘制图像大全】(二十三):Matplotlib保存图像

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

Sqli-Libs 速通

Sqli-Libs持续更新...目标Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16Less-17Less-18Less-19 bp处理Less-20目标 直接写payload&#xff0c;sql语句非预期执行就算成功 表&#xff1a;emails,referers,uagent…

scratch绘制旋转六边形 电子学会图形化编程scratch等级考试二级真题和答案解析2022年9月

目录 scratch绘制旋转六边形 一、题目要求 1、准备工作 2、功能实现

12月2日:thinkphp中数据库完结

数据库的查询 聚合查询 聚合查询的几种方法其中将count作为重点来说&#xff0c;由图所示&#xff0c;即为使用count()方法中需要注意的点 count(*)的使用count()中字段名为具体值的使用方法时间查询 官方文档中列举的是使用wheretime()进行查询的方法&#xff0c;但是在日常的…

如何在Windows上安装并启动MySql

如何在Windows上安装并启动MySql一、MySql 安装包下载二、MySql 初始化三、启动MySql服务四、登录MySql五、修改MySql的root密码六、关于远程登录七、设置环境变量一、MySql 安装包下载 首先进入以下网址&#xff0c;选择合适的版本进行下载即可。 https://dev.mysql.com/dow…

Bootstrap5 安装使用

我们可以通过以下两种方式来安装 Bootstrap5&#xff1a; 使用 Bootstrap5 CDN。 从官网 getbootstrap.com 下载 Bootstrap 5。 Bootstrap 5 CDN 国内推荐使用 Staticfile CDN 上的库&#xff1a; Bootstrap5 CDN <!-- 新 Bootstrap5 核心 CSS 文件 --> <link r…

基于vue-simple-uploader的断点续传

方案&#xff1a; 分片上传&#xff0c;再次上传时&#xff0c;查询已上传分片&#xff0c;继续上传剩余分片 实现效果&#xff1a; 1. 安装uploader和spark-md5的依赖 npm install --save vue-simple-uploader npm install --save spark-md5 2.mainjs导入uploader impo…

日期格式化 YYYY-MM-DD 出现时间偏移量

在js中&#xff0c;很多时候需要把日期字符串转换为一个 Date 对象。 如果得到的日期字符串有时间还好办&#xff0c;如果没有时间&#xff0c;只有日期的格式&#xff0c;例如 2022-12-01 这样的字符串呢&#xff1f; 大部分人可能什么都没想&#xff0c;直接就调用了 new D…

MyBatis-Plus分页查询(快速上手运用)

系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作&#…