CMake教程(八):添加定制命令和生成的文件

本篇继续 CMake 官网教程的第八篇教程,所用材料是 Step8 目录下的源代码。

本篇教程主要讲解如何通过 CMake 生成一个头文件,该头文件当中包含了 1 到 10 的平方根表格,然后在程序的其它部分包含这个生成的头文件。

出于教学的目的,我们现在不打算使用标准库的 logexp 函数。打算使用 mysqrt 函数提前生成一个预计算的表格。本节,我们创建这个表格并将其作为构建过程的一部分,然后将表格编译进程序当中。

首先,在 MathFunctions/CMakeLists.txt 文件中移除对 logexp 函数的检查。接着,在 mysqrt.cxx 文件中移除对 HAVE_LOGHAVE_EXP 的检查。同时,删除 #include <cmath>

MathFunctions 子目录下,MakeTable.cxx 文件用于生成表格。

第一步是在 MathFunctions 子目录下创建 MakeTable.cmake 文件,然后该文件的内容如下:

# 首先生成MakeTable可执行文件
add_executable(MakeTable MakeTable.cxx)
target_link_libraries(MakeTable PRIVATE tutorial_compiler_flags)
# 添加 command 以生成源代码
# OUTPUT后面的参数指明了生成的文件名以及所在的目录
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.hCOMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.hDEPENDS MakeTable)

第二步是修改 MathFunctions/CMakeLists.txt 文件
● 需要让 CMake 知道 mysqrt.cxx 依赖于生成的文件 Table.h

add_library(SqrtLibrary STATICmysqrt.cxx${CMAKE_CURRENT_BINARY_DIR}/Table.h)

● 还需要将当前二进制目录添加到 include 目录的列表中,这样 mysqrt.cxx 文件就能够找到 Table.h 文件。

  target_include_directories(SqrtLibrary PRIVATE${CMAKE_CURRENT_BINARY_DIR})

● 最后,需要包含 MakeTable.cmake
在这里插入图片描述

最后一步,修改 mysqrt.cxx 文件,该文件的全部内容如下:

// #include "MathFunctions.h"
#include "mysqrt.h"
// 包含头文件
#include "Table.h"
#include <cmath>
#include <iostream>namespace mathfunctions {
namespace detail {
// a hack square root calculation using simple operations
double mysqrt(double x)
{if (x <= 0) {return 0;}// if we have both log and exp then use them
#if defined(HAVE_LOG) && defined(HAVE_EXP)double result = std::exp(std::log(x) * 0.5);std::cout << "Computing sqrt of " << x << " to be " << result<< " using log and exp" << std::endl;
#else// use the table to help find an initial valuedouble result = x;if (x >= 1 && x < 10) {std::cout << "Use the table to help find an initial value " << std::endl;result = sqrtTable[static_cast<int>(x)];}// do ten iterationsfor (int i = 0; i < 10; ++i) {if (result <= 0) {result = 0.1;}double delta = x - (result * result);result = result + 0.5 * delta / result;std::cout << "Computing sqrt of " << x << " to be " << result << std::endl;}
#endifreturn result;
}
}
}

使用 cmake 构建和编译:
在这里插入图片描述

到这里官网的 Step8 教程算是结束了。不过,我们可能依然不太清楚使用 CMake 生成表格的作用以及表格具体的生成过程。接下来,就来回答这些问题。

To be continued…

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

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

相关文章

手机实时提取SIM卡打电话的信令声音-新的篇章(二、USB音频线初步探索)

手机实时提取SIM卡打电话的信令声音-新的篇章(二、USB音频线初步探索) 前言 前面的篇章和方案中,我们从架构拓扑和原理的角度分析了使用音频线来绕开手机对SIM卡电话的通话声音的封锁场景的可行性,并尝试拆分和对比模拟3.5mm耳机的音频和USB的数字音频线在使用上的差异。 在…

【ADC】系统误差分析中的统计原理

概述 本文学习于TI 高精度实验室课程&#xff0c;讨论典型和最大数据表规格的统计含义&#xff0c;分析最坏情况分析和查看典型值的统计分析之间的差异。 文章目录 概述一、最坏情况下的误差大小及其概率二、估计误差更好的方法 一、最坏情况下的误差大小及其概率 为了更好地…

【电机-概述及分类】

文章目录 第1章1-1 电机的定义1-2 电机的构成要素1-3 电机的分类1-3-1 直流电机1-3-1-1 永磁励磁型直流电机1-3-1-2 电磁铁励磁型直流电机 第1章 重新认识电机的体系 电机包括许多种类。换个角度来看&#xff0c;并没有完美的电机&#xff0c;某种电机具有所谓A的优点&#xf…

Unreal 对象、属性同步流程

文章目录 类型同步初始化创建 FObjectReplicator创建 FRepLayout、Cmd、ShadowOffset创建 FRepChangedPropertyTracker、FRepState创建 FReplicationChangelistMgr、FRepChangelistState、ShadowBuffer 属性同步属性变化检测查找变化属性&#xff0c;写入ShadowMemory发送数据 …

php email功能实现:详细步骤与配置技巧?

php email发送功能详细教程&#xff1f;如何使用php email服务&#xff1f; 无论是用户注册、密码重置&#xff0c;还是订单确认&#xff0c;电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能&#xff0c;并提供一些配置技巧&#xff0c;帮助你更好…

读代码UNET

这个后面这个大小怎么算的&#xff0c;这参数怎么填&#xff0c;怎么来的&#xff1f; 这是怎么看怎么算的&#xff1f; 这些参数设置怎么设置&#xff1f;卷积多大&#xff0c;有什么讲究&#xff1f;

65.【C语言】联合体

目录 目录 1.定义 2.格式 3.例题 答案速查 分析 4.练习 答案速查 分析 5.相同成员的联合体和结构体的对比 6.联合体的大小计算 2条规则 答案速查 分析 练习 答案速查 分析 7.联合体的优点 8.匿名联合体 1.定义 和结构体有所不同,顾名思义:所有成员联合使用同…

软件设计师——计算机网络

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;软考——软件设计师&#x1f3c5;往期回顾&#x1f3c6;&#xff1a;&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱 一、OSI/ RM七层模型(⭐⭐⭐) ​ 层次 名称 主要功…

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 timer驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "timer.h"int main(void) {H…

latex打出邮箱图标和可点击的orcidID

如图所示&#xff1a; 邮箱的打法 \usepackage{bbding} \inst{(}\Envelope\inst{)}orcidID的打法 \newcommand{\myorcidID}[1]{\href{https://orcid.org/#1}{\includegraphics[width8pt]{res/orcid.png}}} \captionsetup[algorithm]{skip5pt} \definecolor{customblue}{RGB}{…

硬盘数据不翼而飞?2024四大神器帮您找回!

能看到这篇文章的&#xff0c;相信都是一不小心丢失了重要数据的小伙伴。不要慌&#xff0c;以下的这几个硬盘数据恢复软件大家都可以试试&#xff0c;它们大概率能帮助大家找回重要数据&#xff01; 福昕数据恢复 直达链接&#xff08;复制到浏览器打开&#xff09;&#xf…

鸿蒙开发(NEXT/API 12)【穿戴设备信息查询】手机侧应用开发

// 在使用Wear Engine服务前&#xff0c;请导入WearEngine与相关模块 import { wearEngine } from kit.WearEngine; import { BusinessError } from kit.BasicServicesKit;查询穿戴设备是否支持某种WearEngine能力集 注意 该接口的调用需要在开发者联盟申请设备基础信息权限。…

Threejs中使用A*算法寻路导航

<!DOCTYPE html> <html><head><title>Threejs中使用A*算法寻路导航&#xff0c;Threejs室内室外地图导航</title><script type"text/javascript" src"libs/three.js"></script><script type"text/javas…

zabbix7.0监控linux主机案例详解

前言 服务端配置 链接: rocky9.2部署zabbix服务端的详细过程 环境 主机ip应用zabbix-server192.168.10.11zabbix本体zabbix-client192.168.10.12zabbix-agent zabbix-server(服务端已配置) 具体实现过程 zabbix-client配置 安装zabbix-agent 添加扩展包 dnf -y instal…

AD软件的分屏显示功能

1.鼠标右键点击上面的窗格&#xff0c;选择“垂直分布”&#xff0c;即可以将AD软件分屏&#xff0c;左边选择原理图&#xff0c;右边选择PCB即可以方便去设计PCB的布局。实现原理图和pcb文件的同时查看。 还可以建立起2个图之间的联动关系。 比如我们在电路图里面选择stm32 m…

风险函数梳理工具

风险函数梳理工具 在日常的软件开发工作中&#xff0c;代码的安全性和质量至关重要。然而&#xff0c;面对庞大的代码库&#xff0c;手动查找潜在的风险函数不仅耗时&#xff0c;而且容易出错。特别是在团队协作中&#xff0c;代码审查和重构工作往往占据了大量宝贵的时间&…

心理咨询预约管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 心理咨询预约管理系统2拥有三个角色&#xff1a; 管理员端 首页 系统近况&#xff08;咨询师和注册来访者数量&#xff0c;预约数量&#xff09; 显示最新的消息、留言和公告&#xff0…

软件测试学习笔记丨Pytest 学习指南

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32336 基本介绍 pytest框架是一个成熟&#xff0c;全面的测试框架&#xff0c;具有非常丰富的第三方插件&#xff0c;并且可以自定义扩展 比如&#xff1a;pytest-selenium , pytest-html ,…

spring模块都有哪些

Spring 框架是一个庞大而灵活的生态系统&#xff0c;它包含了多个模块&#xff0c;每个模块都提供了特定的功能和服务。以下是一些主要的 Spring 模块&#xff1a; Spring Core&#xff1a; 核心容器&#xff0c;提供了 IoC&#xff08;控制反转&#xff09;和 DI&#xff08;…

推荐4个精准高效的录音转文字软件。

录音转文字在很多的场景中都能够为我们提供便利&#xff0c;比如&#xff1a;可以将课堂录音转换为文字&#xff0c;方便复习和整理笔记&#xff0c;可以将会议录音转换为文字&#xff0c;快速准确地记录内容&#xff0c;可以将采访录音转成文字&#xff0c;提高新闻稿件的撰写…