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

CMake中WIN32和CMAKE_HOST_WIN32的使用差异

在 CMake 中,WIN32CMAKE_HOST_WIN32 是两个完全不同的变量,其作用域和用途有本质区别。它们是否受 CMAKE_SYSTEM_NAME 影响也截然不同。

如果是想判断cmake运行在什么主机系统上,建议使用CMAKE_HOST_WIN32 排除干扰!

以下是详细解析:


📌 核心区别

变量作用域含义何时定义
WIN32目标平台表示 当前构建的目标系统是否为 Windows(包括 Win32/UWP)project() 命令执行后自动设置
CMAKE_HOST_WIN32构建主机表示 运行 CMake 的主机系统是否为 Windows(与目标系统无关)CMake 启动时自动检测

🔧 关键行为分析

1. WIN32 的行为
  • 依赖 CMAKE_SYSTEM_NAME
    当显式设置 CMAKE_SYSTEM_NAME 时(如 set(CMAKE_SYSTEM_NAME Generic)),WIN32 的值会被覆盖:
    set(CMAKE_SYSTEM_NAME Generic)  # 强制目标系统为 Generic
    project(MyProject)
    if(WIN32)  # 此时为 FALSE!因为目标系统被设为 Generic
    
  • 典型用途
    CMakeLists.txt 中判断编译产物的运行平台
    add_executable(my_app main.cpp)
    if(WIN32)target_sources(my_app PRIVATE win_compat.cpp)  # 仅 Windows 目标添加特殊源码
    endif()
    
2. CMAKE_HOST_WIN32 的行为
  • 完全独立于 CMAKE_SYSTEM_NAME
    即使设置 CMAKE_SYSTEM_NAME=Linux,只要主机是 Windows,该变量仍为 TRUE
    set(CMAKE_SYSTEM_NAME Linux)  # 交叉编译到 Linux
    if(CMAKE_HOST_WIN32)  # 在 Windows 主机上运行 CMake 时为 TRUEmessage("CMake is running on Windows!")
    endif()
    
  • 典型用途
    脚本级逻辑中判断当前 CMake 的运行环境
    if(CMAKE_HOST_WIN32)set(TOOL_PATH "C:/tools/bin")  # Windows 主机工具路径
    else()set(TOOL_PATH "/opt/tools/bin")
    endif()
    

⚠️ CMAKE_SYSTEM_NAME Generic 的影响对比

变量是否受 Generic 影响原因
WIN32Generic 显式声明目标系统非 Windows,覆盖默认检测
CMAKE_HOST_WIN32主机系统是物理事实,与目标系统无关

🛠️ 实际案例演示

场景:交叉编译到嵌入式设备(目标系统 Generic
cmake_minimum_required(VERSION 3.20)
set(CMAKE_SYSTEM_NAME Generic)  # 目标系统设为 Genericproject(EmbeddedApp)message("WIN32 = ${WIN32}")                # 输出:WIN32 = 
message("CMAKE_HOST_WIN32 = ${CMAKE_HOST_WIN32}")  # 输出:CMAKE_HOST_WIN32 = 1 (若主机是 Windows)if(CMAKE_HOST_WIN32)# 主机是 Windows:设置 Windows 专用工具链set(CMAKE_C_COMPILER "arm-none-eabi-gcc.exe")
else()set(CMAKE_C_COMPILER "arm-none-eabi-gcc")
endif()if(WIN32)# 此代码块不会执行!因为目标系统不是 Windowsmessage(FATAL_ERROR "This should not happen!")
endif()

💎 总结:选择正确的变量

你需要判断应使用的变量示例场景
编译后的程序是否在 Windows 运行?WIN32添加 Windows API 依赖、.rc 资源文件
CMake 脚本当前是否在 Windows 执行?CMAKE_HOST_WIN32设置主机工具路径、处理路径分隔符 \ vs /

黄金法则

  • 目标平台WIN32
  • 构建主机CMAKE_HOST_WIN32
  • 显式设置 CMAKE_SYSTEM_NAME=Generic破坏 WIN32 的自动检测(需手动处理平台逻辑)。
http://www.lqws.cn/news/579313.html

相关文章:

  • Pytest pytest_runtest_makereport 钩子函数:测试失败信息收集与处理 —— Python 实践
  • (5)pytest-yield操作
  • Python量化金融:从数据到策略的工程实现
  • Serverless 架构入门与实战:AWS Lambda、Azure Functions、Cloudflare Workers 对比
  • CH32H417 替代 Cypress FX3 及优势探讨
  • RF100:多领域目标检测基准数据集(猫脸码客第284期)
  • Ubuntu更换Home目录所在硬盘的过程
  • 多重性校正:临床试验统计的关键防线
  • 文心大模型正式开源,开启AI普惠新时代
  • langchain从入门到精通(二十)——自定义文档加载器使用技巧及Blob 方案介绍
  • 佰力博科技与您探讨阻抗谱测量的基本原理和测量方法
  • web服务器搭建nginx
  • [特殊字符]【联邦学习实战】用 PyTorch 从 0 搭建一个最简单的联邦学习系统(含完整代码)
  • Python-Word文档、PPT、PDF以及Pillow处理图像详解
  • Objective-c把字符解析成字典
  • Python 数据分析与机器学习入门 (六):Seaborn 可视化技巧,图表更美观
  • 车间管理系统架构深度解析:高可用设计+工具技术选型指南
  • 机器学习,支持向量机svm和决策树xgboost介绍
  • WINDOWS最快布署WEB服务器:apache2
  • tcpdump工具交叉编译
  • 【运维系列】【ubuntu22.04】安装GitLab
  • C++STL容器:链表介绍与使用
  • Linux 日志监控工具对比:从 syslog 到 ELK 实战指南
  • 【PHP】.Hyperf 框架-collection 集合数据(内置函数归纳-实用版)
  • PHP学习笔记(十二)
  • 【Java面试】10GB,1GB内存,如何排序?
  • 时序数据库IoTDB监控指标采集与可视化指南
  • HTML中的<div>元素
  • 云效DevOps vs Gitee vs 自建GitLab的技术选型
  • docker安装MySQL,创建MySQL容器