2-添加库

    本节将学习如何在项目中创建和使用库,还将看到如何使库的使用成为可选的。

    本节中使用的示例代码下载见step1-简单开始cmake实践-CSDN博客。

练习1 -创建一个库

    要在CMake中添加一个库,使用add_library()命令并指定哪些源文件应该组成该库。
    我们可以使用一个或多个子目录组织项目,而不是将所有源文件放在一个目录中。在本例中,我们将专门为库创建一个子目录。在这里,我们可以添加一个新的CMakeLists.txt文件和一个或多个源文件。在顶级的CMakeLists.txt文件中,我们将使用add_subdirectory()命令将子目录添加到构建中。
    创建库之后,使用target_include_directories()和target_link_libraries()将其连接到可执行目标。

目标

    添加并使用库。

开始

    在本练习中,我们将在项目中添加一个库,其中包含我们自己的用于计算数字平方根的实现。然后,可执行文件可以使用这个库,而不采用编译器提供的标准平方根函数。
    在本教程中,我们将把库放入名为MathFunctions的子目录中。这个目录已经包含了头文件MathFunctions.h和mysqrt.h。还提供了它们各自的源文件MathFunctions.cxx和mysqrt.cxx。我们不需要修改这些文件。mysqrt.cxx有一个名为mysqrt的函数,它提供了与编译器的SQRT函数类似的功能。MathFunctions.cxx包含一个函数SQRT,用于隐藏我们自己写的SQRT函数的实现细节。
     从在本文提供的代码实例文件夹下/Step2目录中,从TODO 1开始,完成TODO 6。
    首先,在MathFunctions子目录中填写一行CMakeLists.txt。
    接下来,编辑顶层的CMakeLists.txt。
    最后,使用tutorial.cxx中新创建的MathFunctions库。

操作

    在MathFunctions目录下的CMakeLists.txt文件中,我们使用add_library()创建了一个名为MathFunctions的库目标。库的源文件作为参数传递给add_library()。这看起来像下面这行:

// TODO 1: MathFunctions/CMakeLists.txt
add_library(MathFunctions MathFunctions.cxx mysqrt.cxx)

    为了使用新库,我们将在顶级CMakeLists.txt文件中添加add_subdirectory()调用,以便库将被构建。

// TODO 2: CMakeLists.txt
add_subdirectory(MathFunctions)

    接下来,使用target_link_libraries()将新的库目标链接到可执行目标。

// TODO 3: CMakeLists.txttarget_link_libraries(Tutorial PUBLIC MathFunctions)

    最后,我们需要指定库的头文件位置。修改现有的target_include_directories()调用,将MathFunctions子目录添加为包含目录,这样就可以找到MathFunctions.h头文件。

// TODO 4: CMakeLists.txt
target_include_directories(Tutorial PUBLIC"${PROJECT_BINARY_DIR}""${PROJECT_SOURCE_DIR}/MathFunctions")

    现在让我们使用库。在tutorial.cxx中包含MathFunctions.h:

// TODO 5: tutorial.cxx#include "MathFunctions.h"

    最后,用包装函数mathfunctions::sqrt替换sqrt。

// TODO 6: tutorial.cxxconst double outputValue = mathfunctions::sqrt(inputValue);

编译和运行

mkdir Step2_build
cd Step2_build
cmake ../Step2
cmake --build .

    尝试使用编译好的项目,并确保它仍然产生准确的平方根值。

./Tutorial 4294967296
./Tutorial 10
./Tutorial

练习2 -添加选项

    现在让我们在MathFunctions库中添加一个选项,允许开发人员选择自定义的平方根实现或内置的标准实现。
    CMake可以使用option()命令执行此操作。这为用户提供了一个可以在配置cmake构建时更改的变量。

目标

    添加不使用MathFunctions函数的编译选项。

步骤

     首先使用MathFunctions/CMakeLists.txt中的option()命令创建一个变量USE_MYMATH。在同一个文件中,使用该选项将编译定义传递给MathFunctions库。
    然后,更新MathFunctions,基于USE_MYMATH重定向编译。
    最后,当USE_MYMATH打开时,通过在MathFunctions/CMakeLists.txt的USE_MYMATH块中使其成为自己的库。

操作

    第一步是在MathFunctions/CMakeLists.txt中添加一个选项,默认值为ON,可由用户更改。

// TODO 7: MathFunctions/CMakeLists.txt
option(USE_MYMATH "Use tutorial provided math implementation" ON)

    接下来,使用这个新选项使库与mysqrt函数的构建和链接成为有条件的选项。
    创建一个if()语句来检查USE_MYMATH的值。在if()块中,放入target_compile_definitions()命令和编译定义USE_MYMATH。

// TODO 8: MathFunctions/CMakeLists.txt
if (USE_MYMATH)target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")
endif()

条件判断

  • if (USE_MYMATH)
    

    这里使用了 CMake 的 if 命令来判断变量 USE_MYMATH 是否为真(即非空或者非零)。如果 USE_MYMATH 被定义为 ONTRUE、非空字符串或者被设置为一个非零数值,条件判断将会成立。

  • 目标编译定义

  1. target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")
    

    如果 USE_MYMATH 的条件成立,那么就会为目标 MathFunctions 添加一个编译定义。在这里,编译定义是 "USE_MYMATH"。这意味着在编译 MathFunctions 库或可执行文件时,会将 "USE_MYMATH" 添加到编译器的预处理器定义中。

  2. PRIVATE 关键字PRIVATE 关键字指定了这个编译定义的作用域。在 CMake 中,PRIVATE 表示这个定义只会影响到 MathFunctions 目标本身及其直接依赖的其他目标。这意味着其他使用 MathFunctions 的目标或库不会自动继承 "USE_MYMATH" 这个定义,除非它们也显式地声明。

    这段代码的作用是根据 USE_MYMATH 变量的值来决定是否为 MathFunctions 添加一个编译定义 "USE_MYMATH"。这样的做法通常用于根据不同的构建选项或条件,启用或禁用特定的功能或代码路径。

    当USE_MYMATH为ON时,编译定义USE_MYMATH将被设置。然后,我们可以使用这个编译定义来启用或禁用源代码的部分。
    接下来在MathFunctions.cxx文件中,我们让USE_MYMATH控制使用哪个平方根函数:

#ifdef USE_MYMATHreturn detail::mysqrt(x);
#elsereturn std::sqrt(x);
#endif

    接下来,如果定义了USE_MYMATH,我们需要包含mysqrt.h。

// TODO 10: MathFunctions/MathFunctions.cxx#ifdef USE_MYMATH
#  include "mysqrt.h"
#endif

    最后,在使用std::sqrt时,我们需要包含cmath。

// TODO 11 : MathFunctions/MathFunctions.cxx#include <cmath>

    此时,如果USE_MYMATH为OFF, mysqrt.cxx不会被使用,但它仍然会被编译,因为MathFunctions目标有mysqrt.cxx列在来源下面。
    有几种方法可以解决这个问题。第一个选项是使用target_sources()来添加mysqrt.cxx从USE_MYMATH块中取出。另一个选择是在USE_MYMATH块中创建一个额外的库,它负责编译mysqrt.cxx。在本教程中,我们将创建一个额外的库。
    首先,在USE_MYMATH中创建一个名为SqrtLibrary的库,其源代码为mysqrt.cxx。

// TODO 12 : MathFunctions/CMakeLists.txtadd_library(SqrtLibrary STATICmysqrt.cxx)# TODO 6: Link SqrtLibrary to tutorial_compiler_flagstarget_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()

    接下来,当启用USE_MYMATH时,我们将SqrtLibrary链接到MathFunctions。

// TODO 13 : MathFunctions/CMakeLists.txttarget_link_libraries(MathFunctions PRIVATE SqrtLibrary)

    最后,我们可以从MathFunctions库源列表中删除mysqrt.cxxcxx,因为它将在包含SqrtLibrary时被拉入。

// TODO 14 : MathFunctions/CMakeLists.txtadd_library(MathFunctions MathFunctions.cxx)

    通过这些更改,mysqrt函数现在对于正在构建和使用MathFunctions库的人来说完全是可选的。用户可以切换USE_MYMATH来操作编译中使用的库。

编译并运行

    由于我们已经在练习1中配置了编译目录,我们可以通过简单地调用以下命令进行编译:

cd ../Step2_build
cmake --build .

    现在让我们将USE_MYMATH的值更新为OFF。

cmake ../Step2 -DUSE_MYMATH=OFF

    现在,用下面的代码重新编译代码:

cmake --build .

    然后,再次运行可执行文件,以确保它在USE_MYMATH设置为OFF时仍然工作。

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

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

相关文章

接入应用内支付服务,提高商业变现效率

在当今竞争激烈的移动应用市场中&#xff0c;开发者们面临着提升应用商业变现能力的挑战。用户体验的流畅性和支付的安全性至关重要。 HarmonyOS SDK应用内支付服务&#xff08;IAP Kit&#xff09;为开发者提供了一站式的解决方案&#xff0c;简化了应用内支付的接入流程&…

C嘎嘎:类和对象(一)

目录 面向过程和面向对象的初步认识 类的引入 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象模型 如何计算类对象大小 结构体内存对齐规则 this指针 this指针的引出 this指针的特性 类的6个默认成员函数 构造函数 概念 特性 …

喜讯丨美格智能通过国际EcoVadis平台认证企业社会责任并荣获承诺奖章,彰显可持续发展实力

作为全球领先的无线通信模组及解决方案提供商&#xff0c;美格智能在社会责任领域再创新高。近日&#xff0c;美格智能凭借在企业社会责任和可持续性采购发展方面的卓越表现&#xff0c;通过国际在线权威评价机构EcoVadis对公司环境、劳工与人权、商业道德、可持续采购等方面审…

根据空格、制表符、回车符等分割字符串re.split

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 根据空格、制表符、 回车符等分割字符串 re.split [太阳]选择题 根据给定的Python代码&#xff0c;哪个选项是正确的&#xff1f; import re pattern r\s print(f"【显示】pattern{…

高清图片压缩无水印小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今的数字化时代&#xff0c;图片作为信息传播的重要载体&#xff0c;其质量和传输效率直接影响到用户体验。然而&#xff0c;高清图片往往伴随着较大的文件体积&#xff0c;这不仅会占用大量存储空间&#xff0c;还会拖慢网页或应用的加载速度。因此&#xff0c;…

热烈祝贺!全视通多家客户上榜全球自然指数TOP100!

2024年6月18日&#xff0c;全球医疗机构自然指数TOP100榜单发布&#xff0c;中国医疗机构在其中的表现尤为引人注目。 根据《自然》杂志网站发布的数据&#xff0c;此次公布的排名是基于&#xff08;2023年3月1日至2024年2月29日&#xff09;的统计数据&#xff0c;全球医疗机构…

Python在网络爬虫和数据抓取中的应用

Python在网络爬虫和数据抓取中的应用 引言 在数字化时代&#xff0c;数据的价值日益凸显。无论是市场趋势分析&#xff0c;还是个人偏好预测&#xff0c;数据都扮演着至关重要的角色。Python&#xff0c;作为一种功能强大、语法简洁的编程语言&#xff0c;为数据的获取、处理…

旗晟机器人AI智能算法有哪些?

在当今迅猛发展的工业4.0时代&#xff0c;智能制造和自动化运维已然成为工业发展至关重要的核心驱动力。伴随技术的持续进步&#xff0c;工业场景中的运维巡检已不再单纯地依赖于传统的人工运维方式&#xff0c;而是愈发多地融入了智能化的元素&#xff0c;其中智能巡检运维系统…

前端Din字体和造字工房力黑字体文件

Din 字体是一种经典的、简洁的无衬线字体&#xff0c;它源自1930年代的德国交通标志设计。 造字工房力黑字体适用于数字&#xff0c;驾驶舱标题等统计界面 DIN-Medium.otf 案例 造字工房力黑.TTF 案例

记录一次MySql锁等待 (Lock wait timeout exceeded)异常

[TOC](记录一次MySql锁等待 (Lock wait timeout exceeded)异常) Java执行一个SQL查询未提交&#xff0c;遇到1205错误。 java.lang.Exception: ### Error updating database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transactionCluster…

动手学深度学习6.2 图像卷积-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;卷积层_哔哩哔哩_bilibili 代码_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.2. 图像卷积 — 动…

Python使用watchdog库实现监控文件系统的更改

1. 先下载对应库&#xff1a; pip install watchdog import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandlerclass FileChangeHandler(FileSystemEventHandler):def on_modified(self, event):# 当文件被修改时触发此方法…

浅析Nginx技术:开源高性能Web服务器与反向代理

什么是Nginx&#xff1f; Nginx是一款轻量级、高性能的HTTP和反向代理服务器&#xff0c;也可以用作邮件代理服务器。它最初由俄罗斯的程序员Igor Sysoev在2004年开发&#xff0c;并于2004年首次公开发布。Nginx的主要优势在于其非阻塞的事件驱动架构&#xff0c;能够处理大量并…

Vue3使用ref绑定组件获取valueRef.value为null的解决

问题&#xff1a; onMounted(() > {nextTick(()>{console.log(treeselectRef, treeselectRef.value);console.log(treeselectRef.value, treeselectRef.value);}); });输出&#xff1a; 查看绑定和定义都没有问题&#xff0c;还是获取不到 解决&#xff1a;使用getCur…

数据结构第17节 最小堆

最小堆&#xff08;Min Heap&#xff09;是一种特殊的完全二叉树数据结构&#xff0c;在这种结构中&#xff0c;对于任意节点&#xff0c;其值都小于或等于它的子节点的值。根节点是堆中的最小元素。最小堆常用于实现优先队列&#xff0c;以及堆排序算法。 在Java中&#xff0…

14-55 剑和诗人29 - RoSA:一种新的 PEFT 方法

介绍 参数高效微调 (PEFT) 方法已成为 NLP 领域研究的热门领域。随着语言模型不断扩展到前所未有的规模&#xff0c;在下游任务中微调所有参数的成本变得非常高昂。PEFT 方法通过将微调限制在一小部分参数上来提供解决方案&#xff0c;从而以极低的计算成本在自然语言理解任务上…

深度学习(笔记内容)

1.国内镜像网站 pip使用清华源镜像源 pip install <库> -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip使用豆瓣的镜像源 pip install <库> -i https://pypi.douban.com/simple/ pip使用中国科技大学的镜像源 pip install <库> -i https://pypi.mirro…

vite工程化开发配置---持续更新

vite支持tsx开发 根据之前写的文章vue3vitetseslintprettierstylelinthuskylint-stagedcommitlintcommitizencz-git里面tsconfig配置了jsx相关选项&#xff0c;但是想要vite能够识别我们还需要配置一下 安装vitejs/plugin-vue-jsx pnpm i -D vitejs/plugin-vue-jsxvite.confi…

Scapy库实现SYN洪水攻击的Python脚本

Scapy库实现SYN洪水攻击的Python脚本 代码用于学习熟悉Scapy库及其在网络安全研究和测试中提供的各种选项和功能 脚本旨在执行SYN洪水攻击,这是一种分布式拒绝服务(DDoS)攻击的类型。未经授权参与此类攻击通常是违法的,可能会产生严重后果 代码 SynFlood.py from scapy.all…

Google 搜索引擎:便捷高效、精准查询,带来无与伦比的搜索体验

Google搜索引擎不仅具备检索功能&#xff0c;实则是引领探索万千世界的神秘钥匙。试想&#xff0c;无论何时何地&#xff0c;只需轻触屏幕&#xff0c;所需信息即可唾手可得。便捷与高效&#xff0c;令人叹为观止。其界面设计简约直观&#xff0c;操控体验犹如与未来对话&#…