cmake入门系列总结四

2023-11-16

cmake入门系列总结四

__

版本说明

版本 作者 日期 备注
0.1 loon 2019.3.14 初稿

目录

一、添加系统自省

接下来让我们考虑在项目中添加一些代码,这些代码取决于目标平台可能没有的功能。对于此示例,我们将添加一些代码,这些代码取决于目标平台是否具有log和exp函数。当然,几乎每个平台都有这些功能,但本教程假设它们不太常见。如果平台有日志,那么我们将使用它来计算mysqrt函数中的平方根。我们首先使用顶级CMakeLists.txt文件中的CheckFunctionExists.cmake宏测试这些函数的可用性,如下所示:

# does this system provide the log and exp functions?
include (CheckFunctionExists)
check_function_exists (log HAVE_LOG)
check_function_exists (exp HAVE_EXP)

接下来我们修改TutorialConfig.h.in以定义这些值,如果CMake在平台上找到它们,如下所示:

// does the platform provide exp and log functions?
#cmakedefine HAVE_LOG
#cmakedefine HAVE_EXP

在TutorialConfig.h的configure_file命令之前完成log和exp的测试非常重要。configure_file命令使用CMake中的当前设置立即配置文件。最后在mysqrt函数中,如果使用以下代码在系统上可用,我们可以提供基于log和exp的备用实现:

// if we have both log and exp then use them
#if defined (HAVE_LOG) && defined (HAVE_EXP)
  result = exp(log(x)*0.5);
#else // otherwise use an iterative approach
  . . .

二、具体目录结构和演示

这里由于需要使用一些数学函数,所以我们之前的helloWorld测试例子无法使用了,这里我们就实现一下官网给出的例子。

目录结构:

zy@zy-virtual-machine:~/test/cmake_test/tutorial$ tree .
.
├── build
├── CMakeLists.txt
├── TutorialConfig.h.in
└── tutorial.cxx

1 directory, 3 files

tutorial.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"

int main(int argc, char *argv[])
{
    float result = -3;
#if defined (HAVE_LOG) && defined (HAVE_EXP)
    result = exp(log(x) * 0.5);
    printf("result:%f\n", result);
#else
    printf("result:%f\n", result);
#endif

    return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project (Tutorial)

configure_file(
    "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
    "${PROJECT_BINARY_DIR}/TutorialConfig.h"
)

include_directories("${PROJECT_BINARY_DIR}")

include(CheckFunctionExists)
check_function_exists (log HAVE_LOG)
check_function_exists (exp HAVE_EXP)

add_executable(Tutorial tutorial.cxx)

执行过程:

zy@zy-virtual-machine:~/test/cmake_test/tutorial$ cd build/
zy@zy-virtual-machine:~/test/cmake_test/tutorial/build$ ls
zy@zy-virtual-machine:~/test/cmake_test/tutorial/build$ cmake ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for log
-- Looking for log - not found
-- Looking for exp
-- Looking for exp - not found
-- Configuring done
-- Generating done
-- Build files have been written to: /home/zy/test/cmake_test/tutorial/build
zy@zy-virtual-machine:~/test/cmake_test/tutorial/build$ make
Scanning dependencies of target Tutorial
[ 50%] Building CXX object CMakeFiles/Tutorial.dir/tutorial.cxx.o
[100%] Linking CXX executable Tutorial
[100%] Built target Tutorial
zy@zy-virtual-machine:~/test/cmake_test/tutorial/build$ ./Tutorial 
result:-3.000000

三、最后

我这里发现了一个问题:1、我之前将生成的头文件位置指定到了PROJECT_SOURCE_DIR下,重新编译时总是要手动删掉,今天我终于发现了指定的目录错误了,应该是PROJECT_BINARY_DIR这个位置。(之前的错误就放在那里当做一个坑来警醒一下自己要仔细,踩到坑的也不要骂我啊)2、生成的配置文件总是如下所示:

/* #undef HAVE_LOG */
/* #undef HAVE_EXP */

不知道这是什么意思呐?暂时埋在这。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake入门系列总结四 的相关文章

随机推荐

  • GPT概述

    全局唯一标识分区表 GUID Partition Table 缩写 GPT 是一个实体硬盘的分区结构 它是可扩展固件接口标准的一部分 用来替代BIOS中的主引导记录分区表 传统的主启动记录 MBR 磁盘分区支持最大卷为 2 2 TB ter
  • C++之继承

    目录 1 继承的概念及定义 1 继承的概念 2 继承定义 2 基类和派生类对象赋值转换 3 继承中的作用域 4 派生类的默认成员函数 5 继承与友元 6 继承与静态成员 7 复杂的菱形继承及菱形虚拟继承 1 单继承 2 多继承 3 菱形继承
  • 拆解雪花算法生成规则

    1 介绍 雪花算法 Snowflake 是一种生成分布式全局唯一 ID 的算法 生成的 ID 称为 Snowflake IDs 或 snowflakes 这种算法由 Twitter 创建 并用于推文的 ID 目前仓储平台生成 ID 是用的雪
  • visual studio code 2019远程连接服务器

    一 安装sftp 二 配置sftp 按住ctrl ship p键 得到以下画面 选择SFTP Config 当右下角出现 意思时需要一个文件夹 点击open folder后 选择或者创建一个文件夹 再回来按住ctrl shif p就会看到一
  • QT 总结(三) 1.Qt 运行 bat 文件 QProcess 2.获取当前文件路径

    1 Qt 运行 bat 文件 QProcess QProcess p p start cmd exe QStringList lt lt c lt lt c WINDOWS upan2 bat if p waitForStarted p w
  • 求助:tp-link wr720n路由器,想刷打印服务器!

    求助 tp link wr720n路由器 想刷打印服务器 求固件和教程 希望大神赐教
  • 智能图像水位识别系统的工作原理

    系统组成 智能水位图像识别系统主要包括前端设备 传输网络 平台软件和显示终端 采用定时抓拍和自主抓拍图像两种形式 定时或根据需要上传水尺图片 前端设备主要包括网络高速摄像机 水尺 4G流量卡 传输网络主要通过4G网络传输至信息中心 在信息中
  • 会话技术Cookie&Session

    1 会话技术 从打开一个浏览器访问某个站点 到关闭这个浏览器的整个过程 成为一次会话 会 话技术就是记录这次会话中客户端态的状与数据的 会话技术分为Cookie和Session Cookie 数据存储在客户端本地 减少服务器端的存储的压力
  • Ubuntu20.04下载安装FFmpeg源码,并且编译FFmpeg

    一 Terminal终端输入 git clone git source ffmpeg org ffmpeg git ffmpeg 二 安装依赖环境 sudo apt get install y autoconf automake build
  • python基础之程序执行原理(科普)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 计算机的三大件 二 计算机执行 三 python程序的执行原理 四 程序的作用 一 计算机的三大件 1 cpu 本质上是一块超大规模集成电路 2 内存 存储设备
  • 博客摘录「 【MySQL】事务及其隔离性/隔离级别」2023年8月31日

    一般的数据库在可重复读情况的时候 无法屏蔽其他事务insert的数据 因为隔离性实现是对数据加锁完成的 而insert待插入的数据因为并不存在 那么一般加锁无法屏蔽这类问题 这会造成大部分内容虽然是可重复读的 但是insert的数据在可重复
  • web前端面试题整理(前端和计算机相关知识)

    1 你能描述一下渐进增强和优雅降级之间的不同吗 定义 优雅降级 graceful degradation 一开始就构建站点的完整功能 然后针对浏览器测试和修复 渐进增强 progressive enhancement 一开始只构建站点的最少
  • 面试阿里测开岗失败后,被面试官在朋友圈吐槽了......

    前一阵子有个徒弟向我诉苦 说自己在参加某大厂测试面试的时候被面试官怼得哑口无言 场面让他一度十分尴尬 印象最深的就是下面几个问题 根据你以前的工作经验和学习到的测试技术 说说你对质量保证的理解 非关系型数据库和关系型数据库的区别 谈谈优势比
  • 用tornado 连接mysql进行操作报错sqlalchemy.exc.OperationalEror: (pymysql.err.perationalError)(235,Can‘t comect

    用tornado 连接mysql进行操作报错sqlalchemy exc OperationalEror pymysql err perationalError 235 Can t comect to Wy lL serVer on 192
  • 【创作赢红包】云原生之使用Docker部署YApi接口管理服务平台

    云原生之使用Docker部署YApi接口管理服务平台 一 YApi介绍 1 YApi简介 2 YApi功能 二 检查docker环境 1 检查docker版本 2 检查docker状态 三 安装MongoDB数据库 1 创建MongoDB数
  • 百度文库等类似工具的免费下载工具

    百度文库如何免费下载文献 软件介绍 百度文库如何免费下载文献 冰点文库下载器V3 1 9 亲测 可用 软件介绍 无需积分就可以自由下载百度 豆丁 丁香 MBALib 道客巴巴 Book118等文库文档 无需注册和登录 下载的文档最终生成高清
  • 跳动爱心代码-李峋爱心代码(手把手教学)

    电视剧 点燃我 温暖你 打火机与公主裙 李洵爱心跳动效果 获取完整代码 公众号 ClassmateJie 回复爱心代码 本文分为两种方式讲解如何运行代码 第一种方式比较简单推荐新手 完全不懂编程的 第二种方式需要有一定的编程基础的人 跟着我
  • Pytorch Advanced(三) Neural Style Transfer

    神经风格迁移在之前的博客中已经用keras实现过了 比较复杂 keras版本 这里用pytorch重新实现一次 原理图如下 from future import division from torchvision import models
  • spring-boot-devtools引发的类加载器问题

    问题描述 最近在使用spring boot开发系统 发现在某种情况下一些数据库操作会报异常 是hibernate报出来的 在IntellijIDEA中启动程序 nested exception is org hibernate proper
  • cmake入门系列总结四

    cmake入门系列总结四 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 14 初稿 目录 文章目录 cmake入门系列总结四 版本说明 目录 一 添加系统自省 二 具体目录结构和演示 三 最后 一 添加系统自省 接下来让