当前位置: 首页 > news >正文

Cmake入门02-检测环境(笔记)

文章目录

  • 检测操作系统
  • 处理平台相关源码
  • 处理编译器相关源码编译
  • 编译处理器相关源码
    • 检查cpu是32位还是64位的
    • 检测cpu架构
  • 处理 CPU指令相关源码
  • 案例展示 Eigen3向量化加速项目
    • 设置编译器开启向量化优化

《CMake cookbook》笔记

检测操作系统

cmake中通过CMAKE_SYSTEM_NAME变量来识别系统类型。
主流操作系统:

  • Linux
  • Windows
  • Darwin (即macos)
  • AIX (IBM AIX)

例如:

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")do something
endif()

处理平台相关源码

在cpp等源文件中通过宏控制操作系统平台相关源码

例如:

  • target_compile_definitions(targetName PUBLIC/INTERFACE/PRIVATE “IS_LINUX”)

    • 为特定目标设定宏定义等, 精细度控制
  • add_definitions(-DIS_LINUX)

    • 整个CMakeLists.txt项目中都设置宏,精细度小

在源文件中定义

source.cpp
......
#ifdef IS_WINDOWSsource code for windows
#elif IS_LINUXsource code for linux
#elif IS_Darwinsource code for macos
#endif
......

在CMakeLists.txt中定义如下

....
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")target_compile_definitions(helloworld PUBLIC "IS_LINUX")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")target_compile_definitions(helloworld PUBLIC "IS_MACOS")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")target_compile_definitions(helloworld PUBLIC "IS_WINDOWS")
endif()
.....

target_compile_definitions()为特定目标进行定义和编译。
例如

#为源文件helloworld.cpp生成的target hellworld可执行文件定义一个宏IS_LINUX
target_compile_definitions(helloworld PUBLIC "IS_LINUX")

处理编译器相关源码编译

与编译系统相关的源码一样,为源文件设置宏定义。

  • 通过CMAKE_<LANG>_COMPILER_ID获取编译器名称, <LANG>为:
    • CXX
    • C
    • PYTHON
  • 获取编译器名称后为源文件定义宏
    例如:
# 定义源项目中使用的宏定义 IS_XXX_CXX_COMPILER
target_compile_definitions(HelloWorld PUBLIC "IS_${CMAKE_CXX_COMPILER_ID}_CXX_COMPILER")

编译处理器相关源码

检查cpu是32位还是64位的

通过cmake系统变量CMAKE_SIZEOF_VOID_P的大小进行判断.

  • CMAKE_SIZEOF_VOID_P==8 为64位cpu
  • 否则为32位cpu
    例如:
CMakeLists.txt
if(CMAKE_SIZEOF_VOID_P EQUAL 8)#64位cpu相关cmake设置
else()#32位cpu相关cmake设置
endif()

检测cpu架构

通过cmake的CMAKE_HOST_SYSTEM_PROCESSOR系统变量来识别cpu架构

常见cpu架构有:

  • i386
  • i686
  • x86_64
  • AMD64

例如:

if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i386")#i386相关设置elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i686")#i686相关CMake设置elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64")#x86_64相关CMake设置elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "AMD64")#AMD64相关CMake设置else()
endif()
message(STATUS "${CMAKE_HOST_SYSTEM_PROCESSOR} architecture detected")

CMAKE_SYSTEM_PROCESSORCMAKE_HOST_SYSTEM_PROCESSOR有细微差别.

处理 CPU指令相关源码

cmake_host_system_information 该cmake指令用于查询系统中的信息.
例如:

cmake_host_system_information(RESULT _NUMBER_OF_LOGICAL_CORES  QUERY NUMBER_OF_LOGICAL_CORES)

cpu逻辑核心数结果存放在_NUMBER_OF_LOGICAL_CORES中,类似于系统检测, 系统相关, 编译器相关, CPU相关. 获取cpu指令集相关信息后就能在项目中针对不同指令集,包含不同的源文件从而生成适合平台的可执行文件(或库).

tips:

  • 在add_executable()中,可以先不指定源文件
  • 通过检测不同平台的相关信息, 通过cmake if else语句添加对应的源文件.

例如:

# add_executable中源文件为空是为了依据检测到的操作系统类型,编译器类型,cpu架构等来添加相应的源文件
add_executable(targetName "")
if( condition )
# 添加源文件
target_sources(targetName PRIVATE relate_source_file)
endif()
# add file folder for target
target_include_directories(ISC_infoPRIVATE${PROJECT_BINARY_DIR} #当前cmakelists中对应的build文件夹
)
......
#修改并复制一份源文件到另一个位置,比如target_include_directories中指定的build文件夹
configure_file(config.h.in config.h @ONLY)

案例展示 Eigen3向量化加速项目

处理器的向量功能可以加速程序的执行,例如向量运算. eigen是线性代数C++模板库.

设置编译器开启向量化优化

#checkCXXCompilerFlag.cmake标准模块文件:
include(CheckCXXCompilerFlag)
#GNU编译器的向量化加速编译选项
check_cxx_compiler_flag("-march=native" _march_native_works)
# intel编译器的向量化加速编译选项
check_cxx_compiler_flag("-xHost" _xhost_works)
#根据获得的值(例如_march_native_works设定编译选项)
list(APPEND flags "-march=native")
# or 
list(APPEND flags "-xHost")
  • 指示编译器检查处理器,并为当前体系结构生成本机编译优化选项.
  • 使用CheckCXXCompilerFlag.cmake模块提供的check_cxx_compiler_flag函数进行编译器标志的检查

相关文章:

Cmake入门02-检测环境(笔记)

文章目录检测操作系统处理平台相关源码处理编译器相关源码编译编译处理器相关源码检查cpu是32位还是64位的检测cpu架构处理 CPU指令相关源码案例展示 Eigen3向量化加速项目设置编译器开启向量化优化《CMake cookbook》笔记检测操作系统 cmake中通过CMAKE_SYSTEM_NAME变量来识别…...

Android JNI C++读写本地文件

文章目录小结Android JNI使用CAndroid JNI读写本地文件有关权限创建文件夹访问 /storage/emulated/0/访问/data/data/example.jniwritefile/时间戳Cant determine type for tag参考小结 进行Android JNI C读写本地文件&#xff0c;取得了想要的效果。 Android JNI使用C 对于…...

图形化深度学习开发平台PaddleStudio(代码开源)

目录一、PaddleStudio概述二、环境准备2.1 安装PaddlePaddle2.2 安装依赖库三、基本使用介绍3.1 启动3.2 快速体验3.2.1 下载示例项目3.2.2 训练3.2.3 评估3.2.4 测试3.2.5 静态图导出四、数据集格式4.1 图像分类4.2 目标检测4.3 语义分割4.4 实例分割五、趣味项目实战&#xf…...

【力扣-LeetCode】1138. 字母板上的路径-C++题解

1138. 字母板上的路径难度中等98收藏分享切换为英文接收动态反馈我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。在本题里&#xff0c;字母板为board ["abcde", "fghij", "klmno", "pqrst", &quo…...

基于Java+SpringBoot+Vue前后端分离酒店管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…...

【软考系统架构设计师】2022下综合知识历年真题

【软考系统架构设计师】2022下综合知识历年真题 【2022下架构真题第01题&#xff1a;绿色】 01.云计算服务体系结构如下图所示&#xff0c;图中①、②、③分别与SaaS、PaaS、Iaas相对应&#xff0c;图中①、②、③应为( ) A.应用层、基础设施层、平台层 B.应用层、平台层、基础…...

【计组】理解Disruptor--《计算机组成原理》(十五)

Disruptor 的开发语言&#xff0c;并不是很多人心目中最容易做到性能极限的 C/C&#xff0c;而是性能受限于 JVM 的 Java。其实只要通晓硬件层面的原理&#xff0c;即使是像 Java 这样的高级语言&#xff0c;也能够把 CPU 的性能发挥到极限。 一、Padding Cache Line&#xff…...

Windows11 安装Apache24全过程

Windows11 安装Apache24全过程 一、准备工作 1、apache-httpd-2.4.55-win64-VS17.zip - 蓝奏云 2、Visual Studio Code-x64-1.45.1.exe - 蓝奏云 二、实际操作 1、将下载好的zip文件解压放到指定好的文件夹。我的是D:\App\PHP下 个人习惯把版本号带上。方便检测错误。 2…...

1302机器翻译(队列)

目录 题目描述 提示 解题思路 代码部分 题目描述 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#…...

AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)

目录 4806. 首字母大写 题目描述&#xff1a; 实现代码&#xff1a; 4807. 找数字 题目描述&#xff1a; 实现代码&#xff1a; 回溯&#xff08;超时&#xff09;&#xff1a; 原理思路&#xff1a; 贪心&#xff1a; 原理思路&#xff1a; 4808. 构造字符串 问题…...

跟同事杠上了,Apache Beanutils为什么被禁止使用?

收录于热门专栏Java基础教程系列&#xff08;进阶篇&#xff09; 在实际的项目开发中&#xff0c;对象间赋值普遍存在&#xff0c;随着双十一、秒杀等电商过程愈加复杂&#xff0c;数据量也在不断攀升&#xff0c;效率问题&#xff0c;浮出水面。 问&#xff1a;如果是你来写…...

Golang 模糊测试的使用

一 背景 在 Go 1.18 中,Go 语言新增模糊测试(Fuzzing)。Fuzzing,又叫fuzz testing,中文叫做模糊测试或随机测试。其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。模糊测试和常规的功能…...

RSA公钥加密机制跨语言应用实战

在公钥密码学中(也称为非对称密码学)&#xff0c;加密机制依赖于两个密钥&#xff1a;公钥和私钥。公钥用于加密消息&#xff0c;而只有私钥的所有者才能解密消息。实际应用中通常需要对公钥和私钥进行序列化&#xff0c;然后分发密钥实现在不同场景、不同语言环境中使用。本文…...

P7面试送命题

面试总结&#xff0c;对标市场P7。什么叫送命题&#xff0c;一道题回答不上来面试直接挂的题目。JVM 运行时数据区域内存回收机制GC root有哪些volatile原理synchronize原理JDK 集合家族介绍HashMap原理ConcurrentHashMap原理Thread生命周期ThreadPoolExecutor生命周期、实例化…...

零信任-微软零信任介绍(2)

微软零信任是什么&#xff1f; Microsoft Zero Trust 是一种安全架构&#xff0c;旨在在没有信任任何设备、用户或网络的情况下保护网络。这种架构使用多重验证和分段技术&#xff0c;以确保每个请求和资源的安全性。 零信任不假定任何内部用户或设备是安全的&#xff…...

C++中对象调用成员函数this指针的作用

C中对象调用成员函数this指针的作用 Sales_data total;//定义对象 total.isbn();//调用对象中的成员函数isbn成员函数isbn()通过一个名为this的额外隐式参数来访问调用它的对象total。当我们调用一个成员函数时&#xff0c;用请求该函数的对象地址初始化this。 例如&#xff0…...

JavaScript------数组

目录 一、简介 1、什么是数组&#xff1f; 2、创建数组 3、数组的数据类型 4、向数组中添加元素 5、读取数组中的元素 6、实例属性&#xff1a;length 二、遍历数组 方式一&#xff1a;for循环 方式二&#xff1a;for...of 三、数组方法&#xff08;常用&#xff09…...

迷宫《1》

一天蒜头君掉进了一个迷宫里面&#xff0c;蒜头君想逃出去&#xff0c;可怜的蒜头君连迷宫是否有能逃出去的路都不知道。看在蒜头君这么可怜的份上&#xff0c;就请聪明的你告诉蒜头君是否有可以逃出去的路。输入格式第一行输入两个整数 &#xfffd;n 和 &#xfffd;m&#x…...

剑指 Offer 20. 表示数值的字符串

剑指 Offer 20. 表示数值的字符串 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格 一个 小数 或者 整数 &#xff08;可选&#xff09;一个 ‘e’ 或 ‘…...

阻抗匹配之反射波形测量

稍微接触过高速信号的朋友&#xff0c;一定对阻抗匹配和信号反射都有所了解&#xff0c;甚至可以按照公式&#xff0c;把反射波形一路推导出来。但是&#xff0c;纸上得来终绝浅&#xff0c;绝知此事要躬行。 今天&#xff0c;我们就来实测一下信号反射波形&#xff0c;测试环…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...