当前位置: 首页 > 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函数进行编译器标志的检查
http://www.lryc.cn/news/4081.html

相关文章:

  • Android JNI C++读写本地文件
  • 图形化深度学习开发平台PaddleStudio(代码开源)
  • 【力扣-LeetCode】1138. 字母板上的路径-C++题解
  • 基于Java+SpringBoot+Vue前后端分离酒店管理系统设计与实现
  • 【软考系统架构设计师】2022下综合知识历年真题
  • 【计组】理解Disruptor--《计算机组成原理》(十五)
  • Windows11 安装Apache24全过程
  • 1302机器翻译(队列)
  • AcWing、第 90 场周赛:4806. 首字母大写、4807. 找数字、4808. 构造字符串(C++)
  • 跟同事杠上了,Apache Beanutils为什么被禁止使用?
  • Golang 模糊测试的使用
  • RSA公钥加密机制跨语言应用实战
  • P7面试送命题
  • 零信任-微软零信任介绍(2)
  • C++中对象调用成员函数this指针的作用
  • JavaScript------数组
  • 迷宫《1》
  • 剑指 Offer 20. 表示数值的字符串
  • 阻抗匹配之反射波形测量
  • 微信小程序 java家校通Springboot中小学家校联系电子作业系统
  • Fluent Python 笔记 第 8 章 对象引用、可变性和垃圾回收
  • 转义字符的分类
  • 剑指 Offer 03. 数组中重复的数字
  • 飞速创新更新IPO招股书:计划募资约14亿元,向伟为实际控制人
  • JUC(java.util.concurrent) 的常见类
  • Angular4 中 ckeditor5 插件的使用
  • [python刷题模板] 前缀函数/next数组/kmp算法
  • rust 程序设计语言入门(1)
  • 基于蜣螂算法改进的LSTM预测算法-附代码
  • Python安全开发——Scapy流量监控模块watchdog