cmakelists.txt中if条件判断用于根据平台、编译器或用户选项自动切换构建逻辑,需遵循if/else/endif结构,用cmake_system_name等变量精准判断平台,通过option()声明选项并检查其值,支持and/or/not组合条件。

在CMakeLists.txt中写if条件判断,是为了让构建脚本能根据操作系统、编译器或用户传入的选项自动切换逻辑,比如Windows下链接ws2_32.lib,Linux下不加;或者开启调试日志时才编译log.cpp。写错语法会导致configure阶段报错,甚至静默跳过关键步骤。
基础语法:if/else/endif结构
所有if块必须以endif()结尾,括号里可选填与开头匹配的条件名,但不强制——填了反而容易出错,建议留空。
if后面直接跟表达式,不用加$()包裹变量,除非是字符串比较或需要取值的变量引用。
这一步操作起来很简单,直接把if和endif写成对称结构就行。
判断当前平台类型
CMake内置了多个平台相关变量,最常用的是CMAKE_SYSTEM_NAME,它返回Linux/Darwin/Windows等标准名称,比WIN32更可靠。
方法一:用CMAKE_SYSTEM_NAME精确匹配
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_definitions(-DUSE_EPOLL)
endif()
方法二:用WIN32宏兼容旧写法(仅限Windows识别)
if(WIN32)
target_link_libraries(myapp ws2_32)
endif()
【WIN32在MinGW或MSVC下都为TRUE,但在Cygwin或WSL中为FALSE】——如果目标是“所有Windows子系统”,不能只靠WIN32。
CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。
判断用户是否启用某个选项
第一步:先用option()声明一个可配置的布尔选项
option(ENABLE_LOGGING "Enable debug logging" OFF)
第二步:用if()检查该选项是否为ON
if(ENABLE_LOGGING)
add_definitions(-DDEBUG_LOG)
target_sources(myapp PRIVATE src/log.cpp)
endif()
注意:ENABLE_LOGGING本身是缓存变量,它的值在cmake ..首次运行后就固化在CMakeCache.txt里,后续修改option()默认值不会生效,必须删掉build目录重来。
组合多个条件:AND/OR/NOT
方法一:用关键字连接
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND ENABLE_LOGGING)
set(LOG_BACKEND "os_log")
endif()
方法二:嵌套判断(更易读,尤其条件多时)
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(/std:c++17)
endif()
endif()
不要写成if(${CMAKE_SYSTEM_NAME} == "Windows")——变量未加${}时CMake会当作字面量处理,加了反而报错。










