2401cmake,学习cmake1

1步:一个基本出发点

最基础项目是基于源码的一个可执行构建.对简单项目.三行CMakeLists.txt就满足了.
步1路径下创建如下CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)
//设置项目名
project(Tutorial)
//添加可执行文件
add_executable(Tutorial tutorial.cxx)

注意,在CMakeLists.txt文件中,命令都使用小写.CMake命令支持大小写混用.tutorial.cxx的源码在步1目录下,可用它计算平方根.

添加版本号&配置头文件

先给项目和可执行文件提供版本号.尽管可在源码中添加版本号,但使用CMakeLists.txt更灵活.

首先,修改CMakeLists.txt,用project()命令来设置项目名和版本号.

cmake_minimum_required(VERSION 3.10)
//设置项目名和版本
project(Tutorial VERSION 1.0)

然后制定头文件来传递版本号到源码里:

configure_file(TutorialConfig.h.in TutorialConfig.h)

因为会把指定文件写入二进制结构中,必须添加这一目录到搜索include文件的列表中.在CMakeLists.txt文件尾写入:

target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}"
)

使用喜欢的IDE,在源路径下创建TutorialConfig.h.in,并写入:

//教程的`配置选项和设置`
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

CMake生成该头文件时,会自动替换@Tutorial_VERSION_MAJOR@@Tutorial_VERSION_MINOR@的值.

接着调整tutorial.cxx来包含TutorialConfig.h头文件.
最后,如下更新tutorial.cxx来打印可执行文件名和版本号:

if (argc < 2) {
//报告版本
std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."<< Tutorial_VERSION_MINOR << std::endl;
std::cout << "Usage: " << argv[0] << " number" << std::endl;
return 1;
}

指定C++标准

接着,在tutorial.cxx中,替换atofstd::stod来给项目增加一些C++11特性.同时,移除#include.

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

要在CMake代码中显式声明,以使用正确配置.最简单方式是,在CMake中用CMAKE_CXX_STANDARD启用支持指定C++版本标准.

这里.将CMakeLists.txt中的CMAKE_CXX_STANDARD设为11,CMAKE_CXX_STANDARD_REQUIRED设为True.并在add_executable前声明CMAKE_CXX_STANDARD.

cmake_minimum_required(VERSION 3.10)
//设置项目名和版本
project(Tutorial VERSION 1.0)
//指定`C++`标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

构建与测试

运行cmake可执行文件,或cmake-gui来配置项目,然后用所选构建工具构建它.
如,从命令行中,要进入Help/guide/tutorial目录下,并创建一个build目录:

mkdir 步1构建

之后,进入build目录,然后运行CMake来配置项目,并生成原生构建系统:

cd 步1构建
cmake ../1

然后调用该构建系统来实际编译/链接项目:

cmake --build .

最后,试用下述命令使用新构建的Tutorial:

Tutorial 4294967296
Tutorial 10
Tutorial

步2:添加库

现在给项目添加一个包含计算数字平方根实现库.可执行文件就可用而非编译器提供的平方根函数.
这里,在MathFunctions子目录下放置库.该目录已包含了一个MathFunctions.h头文件,也包含了一个mysqrt.cxx源文件.

源文件中包含提供了编译器中sqrt相近功能的叫mysqrt的函数.

MathFunctions目录中,新增下面单行CMakeLists.txt文件:

add_library(MathFunctions mysqrt.cxx)

为了使用新库,在顶级的CMakeLists.txt中加入add_subdirectory()构建库.
可执行文件加入新库,并按包含目录添加MathFunctions,这样就可查询得到mqsqrt.h头文件了.顶级CMakeLists.txt最后几行应该如下:

//添加`MathFunctions`库
add_subdirectory(MathFunctions)
//添加可执行文件
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial PUBLIC MathFunctions)
//在`包含文件`的`搜索路径`中添加`二叉树`,以便找到`TutorialConfig.h`
target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}""${PROJECT_SOURCE_DIR}/MathFunctions"
)

接着让MathFunctions库可作为可选项.在大型项目中这很常见.第一步,是在顶层CMakeLists.txt中增加选项:

option(USE_MYMATH "用这里实现" ON)
//配置头文件以把某些`CMake`设置传递到源码
configure_file(TutorialConfig.h.in TutorialConfig.h)

会在cmake-guiccmake中显示这一选项,默认值为ON,用户也可修改它.会在缓存存储这一选项,用户无需每次都设置.

下一项更改是,把MathFunctions库的构建和链接设置成可选.在顶级CMakeLists.txt尾,如下修改:

if(USE_MYMATH)add_subdirectory(MathFunctions)list(APPEND EXTRA_LIBS MathFunctions)list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
endif()
//添加可执行文件
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})
//在包含文件的搜索路径中添加二叉树,以便找到`TutorialConfig.h`
target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}"${EXTRA_INCLUDES}
)

EXTRA_LIBS变量,收集了之后可在可执行文件链接可选库.EXTRA_INCLUDES变量也相应的收集可选头文件.

处理很多可选项时,这是经典处理方式.下一步会用新方式来做.

相应源码改动就比较直接了.首先,在tutorial.cxx中,如果需要则包含MathFunctions.h:

#ifdef USE_MYMATH
//包括`"MathFunctions.h"`
#endif

然后在同一个文件中,让USE_MYMATH变量控制函数的选择:

#ifdef USE_MYMATHconst double outputValue = mysqrt(inputValue);
#elseconst double outputValue = sqrt(inputValue);
#endif

因为现在源码中需要USE_MYMATH变量,可在TutorialConfig.h.in文件中加入:

#cmakedefine USE_MYMATH

为什么在USE_MYMATH选项后,配置TutorialConfig.h.in.如果交换这两行会怎样?

运行cmakecmake-gui配置项目,然后构建,再运行构建出的可执行文件.

现在更新USE_MYMATH的值.最好是使用cmake-gui或终端中的ccmake.或如果想在命令行中修改这一选项:

cmake ../2 -DUSE_MYMATH=OFF

重构然后运行.
哪个函数结果更好,sqrt还是mysqrt?

步3:对库添加使用依赖

使用依赖可更好控制库或可执行程序使用的链接和包含.CMake也提供了更充分控制可及属性.控制依赖的重要命令包括:

target_compile_definitions
target_compile_options
target_include_directories
target_link_libraries

用现代CMake的方式重构步2中的依赖部分.
首先除了MathFunctions自身,明确链接到MathFunctions的对象都需要包含当前源目录.

所以它可作为一个INTERFACE使用依赖.
记住INTERFACE指的是那些消费者需要而生产者不需要的东西.在MathFunctions/CMakeLists.txt尾加入:

target_include_directories(MathFunctionsINTERFACE${CMAKE_CURRENT_SOURCE_DIR}
)

现在已指定了MathFunctions的使用依赖,就可安全地移除顶级CMakeLists.txt文件中的EXTRA_INCLUDES变量:

if(USE_MYMATH)add_subdirectory(MathFunctions)list(APPEND EXTRA_LIBS MathFunctions)
endif()

及:

target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}"
)

完成后,运行cmakecmake-gui配置项目,并在build目录下cmake --build .构建运行即可.

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

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

相关文章

跨境电商展-2024广州跨境电商展览会(ICBE China 2024)

ICBE2024第11届广州国际跨境电商交易博览会&#xff0c;作为华南地区最具影响力的跨境电商展览会&#xff0c;将再次于2024年5月15-17日在广州保利世贸展览馆盛大举行。此次展会以“创新、合作、共赢”为主题&#xff0c;汇聚了来自全球各地的跨境电商企业、平台、服务商等&…

(2024,定性评估、定量评估、人类评估)神经风格转移评估:综述

Evaluation in Neural Style Transfer: A Review 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 神经风格转移方法 0. 摘要 神经风格转移&#xff08;Neural St…

LeetCode.2808. 使循环数组所有元素相等的最少秒数

题目 题目链接 分析 我们最终形成的数组一定是当前数组nums 中的一个数字。 所以我们的想法就是枚举数组 nums 中的所有数字&#xff0c;取最小值。 题目告诉我们每一秒都可以向左右扩散一位&#xff0c;那么多个相同的 x 同时扩散&#xff0c;扩散完整个数组耗时就取决于两…

主流新能源汽车防盗模式简介

主流新能源汽车中&#xff0c;守卫模式是指车辆在停车状态下&#xff0c;通过特定的硬件和软件系统来保护车辆的安全&#xff0c;防止车辆被盗或被破坏。不同品牌的新能源汽车中&#xff0c;守卫模式的名称和功能略有不同&#xff0c;以下是常见的几种守卫模式及其对标&#xf…

BroadcastChannel使用

BroadcastChannel() 构造函数用于创建一个 BroadcastChannel 对象&#xff0c;并与底层的通道相关联。 channelName 表示通道名称的字符串&#xff1b;对于相同的来源下的所有浏览上下文&#xff0c;一个名称只对应一个通道 发送者 const channel new BroadcastChannel(&qu…

Django实例_后台管理及分页器

原理步骤参考: Django开发_14_后台管理及分页器-CSDN博客 一、创建Django项目 二、创建page_app python manage.py startapp page_app三、修改settings.py文件 (一)添加app (二)设置每页显示数据个数 (三)设置中文显示 四、总路由添加子路由路径 from django.contrib impo…

210. 课程表 II

210. 课程表 II 题目链接&#xff1a;210. 课程表 II 代码如下&#xff1a; //拓扑排序&#xff1a;判断图中是否存在回路 class Solution { public:vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {vector<int> r…

最全前端 HTML 面试知识点

一、HTML 1.1 HTML 1.1.1 定义 超文本标记语言&#xff08;英语&#xff1a;HyperTextMarkupLanguage&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言 HTML元素是构建网站的基石 标记语言&#xff08;markup language &#xff09; 由无数个…

PyTorch深度学习实战(34)——Pix2Pix详解与实现

PyTorch深度学习实战&#xff08;34&#xff09;——Pix2Pix详解与实现 0. 前言1. 模型与数据集1.1 Pix2Pix 基本原理1.2 数据集分析1.3 模型构建策略 2. 实现 Pix2Pix 生成图像小结系列链接 0. 前言 Pix2Pix 是基于生成对抗网络 (Convolutional Generative Adversarial Netwo…

pinctrl/gpio子系统(1)-pinctrl子系统介绍及驱动源码分析

1.简介 在如今的驱动开发工作中&#xff0c;实际上已经很少去对着寄存器手册进行驱动开发了&#xff0c;一般板子拿到手&#xff0c;已经有原厂的驱动开发工程师&#xff0c;在gpio子系统、pinctrl子系统中将自家芯片的引脚适配好了。 我们直接基于设备树已配置好的寄存器值&a…

SpringBoot引入Mybatis-Plus(详细)

文章目录 1.引入依赖2.不能使用mybatis的数据源&#xff0c;使用mybatisPlus的3.配置yml文件 1.引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>…

计算机网络_1.4 计算机网络的定义和分类

1.4 计算机网络的定义和分类 一、计算机网络的定义&#xff08;无唯一定义&#xff09;二、计算机网络的分类&#xff08;从不同角度分类&#xff09;1、交换方式2、使用者3、传输介质4、覆盖范围5、拓扑结构 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 一、计算机…

【MySQL】学习并使用聚合函数和DQL进行分组查询

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-t8K8tl6eNwqdFmcD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

飞桨大模型分布式训练技术

今天我为大家介绍飞桨大模型分布式训练技术&#xff0c;内容分为以下几个部分&#xff1a; 首先&#xff0c;我会介绍大模型训练面临的重点难题&#xff1b;然后&#xff0c;为大家介绍飞桨在大模型训练领域的特色分布式训练技术和优化方案&#xff1b;最后&#xff0c;伴随着…

ONLYOFFICE | 免费开源办公神器新选择

目录 前言&#xff1a; 1、什么是ONLYOFFICE&#xff1f; 2、ONLYOFFICE下载使用 3、ONLYOFFICE团队协作云办公功能 4、ONLYOFFICE 8.0新版本的亮点功能 4.1、显示协作者头像 4.2、插件 UI 界面更新 4.3、可填写的 PDF 表单 5、最后 前言&#xff1a; 一个好的开发工具…

blender关于几何接近(geometry proximity)节点的理解

如图&#xff0c;可以见到&#xff0c;我输入了一个立方体&#xff0c;一个圆锥体&#xff0c;为了便于区分 &#xff0c;将原生的立方体与圆锥转为了曲线&#xff0c;而进行了几何接近处理的网格不进行此转换。 几何接近的输入端&#xff0c;分为target&#xff08;目标&…

Adobe Photoshop 2024 v25.4.0 - 专业的图片设计软件

Adobe Photoshop 2024 v25.4.0更新了&#xff0c;从照片编辑和合成到数字绘画、动画和图形设计&#xff0c;任何您能想象到的内容都能通过PS2024轻松实现。 利用人工智能技术进行快速编辑。学习新技能并与社区分享您的工作。借助我们的最新版本&#xff0c;做令人惊叹的事情从未…

全面详解Maven的配置文件settings.xml

全面详解Maven的配置文件settings.xml setting文件位置maven多仓库查找依赖的顺序大致如下&#xff1a;基本配置选项localRepository(本地仓库设置)mirrors(镜像设置)servers(服务器)Profiles(配置文件)Active Profiles(激活配置文件Profiles的Profile) Maven是一个用于构建和管…

eNSP学习——配置STP定时器

储备知识 a)Hello Time:指允许STP的设备发送BPDU的时间间隔。当网络拓扑稳定之后,若要修改该定时器,只有 在根桥修改才能生效。 b)Forward Delay:指接口进行状态更换的延迟时间。也就是在处于Listening和Learning的持续时间, 缺省值为15秒。 c)Max …