6-添加自定义命令和生成的文件

    本文使用的示例代码见1-简单开始cmake实践-CSDN博客。

    假设,出于本教程的目的,我们决定不使用平台log和exp函数,而是希望生成一个预先计算值的表,以便在mysqrt函数中使用。在本节中,我们将创建表作为构建过程的一部分,然后将该表编译到我们的应用程序中。

    首先,让我们删除MathFunctions/CMakeLists.txt中对日志和exp函数的检查。然后从mysqrt.cxx中删除对HAVE_LOG和HAVE_EXP的检查。同时,我们可以删除#include <cmath>。
    在MathFunctions子目录中,有一个名为MakeTable的新源文件。已提供CXX生成表格。
    检查完文件后,我们可以看到表是作为有效的c++代码生成的,并且输出文件名作为参数传入。
    下一步是创建MathFunctions/MakeTable.cmake。然后,将适当的命令添加到文件中以构建MakeTable可执行文件,然后将其作为构建过程的一部分运行。需要几个命令来完成这个任务。

    首先,为MakeTable添加一个可执行文件。

// MathFunctions/MakeTable.cmakeadd_executable(MakeTable MakeTable.cxx)

    在创建可执行文件之后,我们使用target_link_libraries()将tutorial_compiler_flags添加到可执行文件中。

// MathFunctions/MakeTable.cmake
target_link_libraries(MakeTable PRIVATE tutorial_compiler_flags)

    然后添加一个自定义命令,指定如何通过运行MakeTable生成Table.h。

// MathFunctions/MakeTable.cmake
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.hCOMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.hDEPENDS MakeTable)

解释:

  1. OUTPUT 参数

    • 指定了自定义命令生成的输出文件。在这个例子中,${CMAKE_CURRENT_BINARY_DIR}/Table.h 是生成的输出文件的路径和名称。
  2. COMMAND 参数

    • 指定了实际的命令。在这里,命令是 MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h。这意味着要在构建过程中执行 MakeTable 程序,并将其输出写入 ${CMAKE_CURRENT_BINARY_DIR}/Table.h 文件中。
  3. DEPENDS 参数

    • 指定了生成输出文件所依赖的其他文件或目标。在这里,指定了 MakeTable,表明在执行命令之前,需要确保 MakeTable 已经被构建或可执行。

总结:

通过 add_custom_command,上述代码片段实现了以下功能:

  • 在 CMake 构建过程中,定义了一个名为 Table.h 的自定义生成规则。
  • 当构建过程需要 ${CMAKE_CURRENT_BINARY_DIR}/Table.h 这个文件时,会执行 MakeTable 程序来生成它。
  • 确保在执行生成命令之前,会先构建 MakeTable

    这种方法通常用于生成代码、复制文件或执行其他自定义构建任务,使得 CMake 的构建系统能够灵活地扩展和自定义。

    接下来我们要让CMake知道这个mysqrt.cxx依赖于生成的文件Table.h。这是通过将生成的Table.h添加到SqrtLibrary库的源列表中来实现的。

// MathFunctions/CMakeLists.txt¶add_library(SqrtLibrary STATICmysqrt.cxx${CMAKE_CURRENT_BINARY_DIR}/Table.h)

    我们还必须将当前二进制目录添加到包含目录列表中,以便可以找到Table.h并由mysqrt.cxx包含。

// MathFunctions/CMakeLists.txttarget_include_directories(SqrtLibrary PRIVATE${CMAKE_CURRENT_BINARY_DIR})# link SqrtLibrary to tutorial_compiler_flags

    作为最后一步,我们需要包含MakeTable.cmake在MathFunctions/CMakeLists.txt的顶部。

// MathFunctions/CMakeLists.txt¶include(MakeTable.cmake)

    现在让我们使用生成的表。首先,修改mysqrt.cxx以包括Tbale.h。接下来,我们可以重写mysqrt函数来使用这个表:

// MathFunctions/mysqrt.cxxdouble mysqrt(double x)
{if (x <= 0) {return 0;}// 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;}return result;
}
}
}

    当编译这个项目时,它将首先构建MakeTable可执行文件。然后,它将运行MakeTable以生成Table.h。最后,它将编译mysqrt.cxx,mysqrt.cxx包含了Table.h来生成MathFunctions库。

mkdir Step8_build
cd Step8_build
cmake ../Step8
cmake --build .


    运行Tutorial可执行文件并验证它是否正在使用表。

./Tutorial 9

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

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

相关文章

1区老牌神刊,仅37天录用!网友:“这审稿速度救了我一条命”!

关注GZH【欧亚科睿学术】&#xff0c;GET完整版2023JCR分区列表&#xff01; ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 期刊信息概况 【期刊类型】计算机科学类SCIE&EI 【出版社】ELSEVIER出版社 【期刊概况】IF&#xff1a;4.0-5.0&#xff0c;JCR1区&#xff0c;中科院3区…

用 Dockerfile 创建镜像的基本步骤有哪些?

使用 Dockerfile 创建镜像的基本步骤如下&#xff1a; 定义基础镜像 在 Dockerfile 的开头&#xff0c;使用 FROM 指令指定一个基础镜像。例如&#xff1a; FROM ubuntu:latest这表示基于最新的 Ubuntu 镜像来构建。 安装依赖和软件 使用 RUN 指令来执行命令&#xff0c;安装…

电脑文件xinput1_3.dll丢失要怎么修复win10?一键解决xinput1_3.dll丢失的方法

电脑文件xinput1_3.dll丢失要怎么修复win10&#xff1f;其实无论是哪种系统&#xff0c;是不是win10其修复方法都是大同小异&#xff0c;不过在修复xinput1_3.dll文件之前&#xff0c;首先我们要先了解这个xinput1_3.dll文件&#xff0c;只有了解了&#xff0c;那么才可以快速的…

奇瑞新能源车型EQ2在驾校领域的CAN总线数据应用

在当今这个快速发展的汽车时代&#xff0c;科技的进步不仅推动了汽车性能的提升&#xff0c;也为驾驶培训领域带来了革命性的变化。其中&#xff0c;奇瑞EQ2作为一款电动汽车&#xff0c;其在驾校领域的应用尤其值得关注&#xff0c;特别是其采用的CAN总线技术。CAN总线&#x…

【productj服务导出文件503问题】

设备服务只要导出文件&#xff0c;就报503&#xff0c;查看K8S发现服务重启 1. 复现问题1.1 问题复现频繁fullGC 宿主pod服务日志监控1.2 小内存复现 接口没啥问题&#xff0c;导出就会导致服务重启 1. 复现问题 当前uat环境配置&#xff1a; pod内存&#xff1a;2G JVM参数&a…

Python 利用pandas处理CSV文件(DataFrame的基础用法)

前面介绍过通过Python标准库中的CSV模块处理CSV文件&#xff1a; Python 利用CSV模块处理数据 相比CSV模块&#xff0c;pandas的功能更加强大&#xff0c;本文将简单介绍如何通过pandas来处理CSV文件。 文章目录 一、pandas简介二、用法示例2.1 读取CSV文件2.1.1 read_csv参数…

设计模式使用场景实现示例及优缺点(创建型模式——单例模式、建造者模式、原型模式)

创建型模式 单例模式&#xff08;Singleton Pattern&#xff09; 单例模式&#xff08;Singleton Pattern&#xff09;在Java中的使用场景与在其他编程语言中类似&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供一个全局的访问点。以下是单例模式的一些常…

现代化3D Web轻量引擎HOOPS Communicator:基于ESM的代码库转型!

HOOPS Communicator自2024.2.0版本起&#xff0c;向基于ECMAScript Modules (ESM)的系统迁移的决策和技术细节。文章分析了这一转型对代码组织、封装、依赖管理、性能以及与现代JavaScript开发实践兼容性的积极影响&#xff0c;并讨论了IIFE和UMD的兼容性支持。 引言 随着Jav…

聊聊springboot项目如何利用jmh来进行基准测试

前言 1、什么是JMH JMH&#xff08;Java Microbenchmark Harness&#xff09;是由OpenJDK团队开发的一个用于Java微基准测试工具套件&#xff0c;主要是基于方法层面的基准测试&#xff0c;精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能&…

[kuangbin]基础dp

Max Sum Plus Plus 题目大意&#xff1a;从一串数组中挑选连续m段子数组&#xff0c;使得最后的sum最大。 思路&#xff1a;首先考虑开二维数组&#xff0c;那么动态转移方程为&#xff1a; dp[i][j]max(dp[i-1][k]a[j],dp[i][j-1]a[j]) 其中dp表示枚举到第 j 个数的时候&#…

【深度学习(42)】通过vscode使用anaconda的python环境

按ctrlshiftp&#xff0c;选择Python:Select Interpreter 选择anaconda下的python虚拟环境

Elasticsearch 高亮搜索结果:提升用户体验的关键技术

在构建搜索引擎或任何需要快速、准确信息检索的应用时&#xff0c;搜索结果的高亮显示是一项至关重要的功能。它不仅能够显著提升用户的搜索体验&#xff0c;还能帮助用户更快地定位到他们感兴趣的内容。Elasticsearch&#xff0c;作为当今最流行的开源搜索和分析引擎之一&…

【k8s安装redis】k8s环境无pvc的情况下安装redis哨兵集群

文章目录 简介一.条件及环境说明&#xff1a;二.需求说明&#xff1a;三.实现原理及说明四.详细步骤4.1.规划节点标签4.2.创建configmap配置4.3.创建三个statefulset和service headless配置4.4.创建哨兵deployment配置和service配置 五.安装说明 简介 k8s集群中搭建有状态的服务…

大模型备案全网最详细流程说明【附附件】

下图为最新的直至第五批深度合成服务算法备案信息的公告 根据目前公开的国内大模型算法备案统计来看&#xff0c;首批境内深度合成服务算法备案清单&#xff0c;总共通过了五批。 以第二批举例&#xff0c;境内深度合成服务算法备案清单&#xff0c;总共通过110家&…

秒与时间转换器

目录 开头程序程序的流程图程序输入与输出的效果例1输入输出 例2输入输出 例3输入输出 结尾 开头 大家好&#xff0c;我叫这是我58。在这里&#xff0c;我要给大家介绍一下我用C语言编译的秒与时间转换器和与之相关的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #in…

基于FaceX-Zoo里的faceSDK实现人脸识别(与人脸库结合比对人脸)

目录 一、简介 二、face SDK 1、环境需要 2、功能实现 2.1人脸库搭建 2.2人脸识别 3、测试结果 4、总结 本文根据京东开源的人脸识别工具包FaceX-Zoo,实现了人脸识别功能。对代码中的faceSDK部分做了修改,并搭建了自己的人脸库,识别结果准确度较高,后期可以打包SDK…

HTTP Client

从jdk9开始引入HTTP Client标准化,在jdk10开始更新。通过CompletableFutures提供了非阻塞请求和响应式。流量控制在java.util.concurrent.Flow API提供支持。更容易的跟踪数据流:从用户请求发布者和响应订阅者,一直到底层套接字。 public void get(String uri) throws Exce…

uni app for()在App上不运行

项目场景&#xff1a; uniapp单选 文字 显示 text &#xff1a; 问题描述 h5 有效 安卓App 无效 for(var i 0;i<from.length();i){}解决方案&#xff1a; this.from.forEach((itme,index)>{this.sex.push({value:itme.nodeCode,text:itme.nodeName});this.sex1.pus…

Python的异常处理(与C++对比学习)

一、C语言中错误的处理方式 用assert来判断一个表达式是否出错&#xff1b;在调用接口函数时&#xff0c;接口函数会设置errno&#xff0c;我们可以通过errno&#xff0c;strerror(errno)来拿到错误码和错误信息。在自定义函数中&#xff0c;我们设置函数错误信息处理的时候&a…

告别堆积,迎接清新:回收小程序,打造无废生活新选择

在快节奏的现代生活中&#xff0c;物质的丰富与便利似乎成为了我们日常的一部分&#xff0c;但随之而来的&#xff0c;是日益增长的废弃物堆积问题。街道边、社区里&#xff0c;甚至是我们的家中&#xff0c;废弃物品仿佛无孔不入&#xff0c;逐渐侵蚀着我们的生活空间与环境质…