1. 说明
cmake一个重要的特点便是可以跨平台代码构建,即同一套源代码可以在不改动的情况下直接迁移到另一中操作系统进行编译。这篇笔记用于说明如何在CMakeLists.txt中判断当前操作系统类型并支持Windows和Linux系统编译。
2. 解决方案
不同平台可能使用不同的编译器,对应的编译器选项和参数也可能不同,要适配多种操作系统的关键在于cmake要判断当前系统的类型,选择相应的编译器。
判断操作系统的方法一般有两种。
2.1 根据CMAKE_SYSTEM_NAME判断
CMAKE_SYSTEM_NAME变量用于描述当前系统名称,如"Linux","Windows"等。如果还需对系统版本进行判断,那么需要与CMAKE_SYSTEM_VERSION变量联用,该变量记录编译系统的版本。
示例
if (CMAKE_SYSTEM_NAME MATCHES "Linux") # for Linux
<command>...
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows") # for Windows
if(CMAKE_SYSTEM_VERSION MATCHES 10.0) # for Win10
<command>...
elseif(CMAKE_SYSTEM_VERSION MATCHES 8.1) # for Win8.1
<command>...
endif()
endif()
通常情况下判断操作系统类型就已经足够。
部分支持的系统名称如下:
- Linux
- QNX
- WindowCE
- Windows
- WindowsStore
- WindowsPhone
- Android
- Apple…
注:CMAKE_SYSTEM_NAME变量会自动识别,也就是说如果不确定当前系统的名称,可以通过message(${CMAKE_SYSTEM_NAME})查看。
## 2.2 通过WIN32等bool型变量判断
if (WIN32)
<command>...
elseif (UNIX)
<command>...
elseif (APPLE)
<command>...
elseif (ANDROID)
<command>...
endif()
- WIN32:如果为True,说明当前系统为Windows平台,包括Win64
- UNIX:unix系统或类unix系统
- APPLE:apple系统,包括macOS, iOS, tvOS 和 watchOS
- ANDROID:安卓系统
更多变量可参考:https://cmake.org/cmake/help/v3.17/manual/cmake-variables.7.html
3. if命令解析
if()是cmake的条件执行命令,用于控制编译流程。
用法
if(<condition>)
<commands>
elseif(<condition>) # optional block, can be repeated
<commands>
else() # optional block
<commands>
endif()
判断条件
NOT:条件为否
AND
OR
更多判断条件参考:https://cmake.org/cmake/help/v3.17/command/if.html?highlight=elseif