CMake之环境检查
构建项目时难免需要一些跟平台或环境相关的依赖文件或代码,这时候就需要在构建项目时能够识别出不同的环境。
检查操作系统#
cmake_minimum_required(VERSION 3.20)
project(cmake2 LANGUAGES CXX)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
message(STATUS "configuring on/for Linux")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
message(STATUS "configuring on/for Windows")
endif()
例如CMakeLists.txt中这样几行代码,在执行cmake ..
时,会打印出下面内容
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045.
-- configuring on/for Windows
-- Configuring done (0.0s)
-- Generating done (0.0s)
其中就检测到了我当前的环境是windows环境,于是打印了对应的一句话。
工作原理#
CMake中定义了CMAKE_SYSTEM_NAME
变量,类Linux环境下如果有uname
命令,可以看作是uname -s
命令输出的内容,比如在ubuntu下就会输出Linux,Windows下不知道是哪个命令,不过从上面输出内容来看,应该会输出字符串Windows。
平台相关代码#
如果main.cpp中有这样一段代码
int main() {
#ifdef IS_LINUX
cout << "hello, linux!\n";
#elif IS_WINDOWS
cout << "hello, windows!\n";
#endif
return 0;
}
然后在CMakeLists.txt中根据不同的操作系统定义了不同的宏,就可以使源码在不同环境下有不同的表现。
file(GLOB Src *.cpp)
add_executable(target ${Src})
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_compile_definitions(target PUBLIC "IS_LINUX")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_compile_definitions(target PUBLIC "IS_WINDOWS")
endif()
这样如果在Windows环境下执行生成的target.exe,就会在终端中看到
hello, windows!
编译器相关代码#
如果在当前环境下有多个编译器可供使用,我们可以指定使用某个编译器来执行当前的编译工作,在CMake中也定义了CMAKE_CXX_COMPILER_ID
变量来区分不同的编译器,例如GNU
、Intel
等,这样我们可以执行和上述类似的操作,使代码在不同的编译器中有不同的表现行为。
处理器体系架构#
众所周知,处理器有32位和64位之分,如果代码对于不同架构要表现不同的行为的话,就需要能够识别出当前的处理器是多少位的,可以通过CMake中定义的CMAKE_SIZEOF_VOID_P
变量来识别,这个变量的意思是空指针的字节大小,我们知道32位CPU的指针大小是4字节,而64位CPU的指针大小是8字节,通过比较变量CMAKE_SIZEOF_VOID_P
和8是否相等,就能够区分处理器的体系架构。
CMake不止上述的几个变量,关于主机系统的信息几乎都会有对应的变量,需要时可以查找对应的变量来配置项目。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南