CMake语法

CMake语法

CMake是跨平台构建工具,通过CMakeLists.txt描述编译规则,生成 Makefile/VS工程/Ninja等,再调用编译器构建。

1. 基础规则

1.1主文件

CMakeLists.txt根目录必须有,大小写敏感。

1.2命令格式

① 不区分大小写

② 参数用空格/换行分隔,括号不能丢

③ 字符串含空格用双引号包裹

如:

add_executable(QMLTest04 main.cpp) set(CMAKE_PREFIX_PATH "D:/Qt/Qt6.11.1/6.11.1/mingw_64") target_link_libraries(QMLTest04 Qt::Core Qt::Gui Qt::Widgets )

1.3 注释

#注释内容

无多行注释,只有单行注释。

如:

#MESSAGE(WARNING "This is BINARY dir " ${QMLTest04_BINARY_DIR})

1.4 变量

定义/赋值:set(变量名 值)

取值:${变量名}

如:

set(CMAKE_PREFIX_PATH "D:/Qt/Qt6.11.1/6.11.1/mingw_64") set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")

2. 核心命令

2.1 最低版本要求

cmake_minimum_required(VERSION 4.2)

2.2 定义项目

2.2.1 设置项目、语言、版本

project(QMLTest04) project(MyProject LANGUAGES C CXX VERSION 1.0)

2.2.2内置自动变量

·${PROJECT_NAME}:项目名

·${PROJECT_SOURCE_DIR}项目根目录(源码根路径)

·${PROJECT_BINARY_DIR}构建目录(编译输出目录)

MESSAGE( "项目名称:" ${PROJECT_NAME}) MESSAGE( "项目根目录:" ${PROJECT_SOURCE_DIR}) MESSAGE( "构建目录:" ${PROJECT_BINARY_DIR})

输出结果:

项目名称:QMLTest04 项目根目录:E:/C++/Demo/QMLTest04 构建目录:E:/C++/Demo/QMLTest04/cmake-build-debug

2.3 定义变量/列表

2.3.1 普通变量

set(APP_NAME TestApp) set(VERSION "1.0.0")

2.3.2 文件列表(多参数=列表)

set(SRCS main.cpp hello.cpp util.c )

2.4 生成可执行文件

编译源码为exe/可执行程序,语法:

add_executable(输出文件名 源码列表),如:

#单个源码 add_executable(QMLTest04 main.cpp) #多个源码 add_executable(demo main.cpp test.cpp) #使用变量(推荐,易维护) add_executable(demo ${SRCS})

2.5 生成库文件

# 1. 静态库 (.a / .lib) # add_library(库名 STATIC 源码文件) # 2. 动态库 (.so / .dll) # add_library(库名 SHARED 源码文件) set(LIB_SRCS func.cpp) add_library(mylib STATIC ${LIB_SRCS})

2.6 链接库

给目标(可执行文件/库)链接依赖库,语法:

target_link_libraries(目标名 库名1 库名2 ...)

示例:

# 可执行文件demo链接静态库mylib target_link_libraries(demo mylib)

2.7 头文件搜索路径

添加.h/.hpp头文件目录,编译时能直接#include "xxx.h"

include_directories(头文件目录路径)

常用搭配(相对路径):

include_directories(${PROJECT_SOURCE_DIR}/include)

现代CMake更推荐target_include_directories(作用范围更精准):

target_include_directories(demo PRIVATE ${PROJECT_SOURCE_DIR}/include)

3. 路径与常用内置变量

不用手动定义,CMake自带:

${CMAKE_SOURCE_DIR} # 整个工程根目录 ${CMAKE_BINARY_DIR} # 顶层构建目录 ${CMAKE_CURRENT_SOURCE_DIR} # 当前 CMakeLists.txt 所在目录 ${CMAKE_CURRENT_BINARY_DIR} # 当前目录对应的构建目录 # 编译器相关 ${CMAKE_C_COMPILER} # C 编译器 ${CMAKE_CXX_COMPILER} # C++ 编译器

4. 条件判断if语法

4.1 基础判断

if(条件) 命令... elseif(其他条件) 命令... else() 命令... endif()

4.2 常用条件

# 判断变量是否存在/非空 if(DEFINED APP_NAME) # 判断操作系统 if(WIN32) message("当前是 Windows") elseif(UNIX) message("当前是 Linux/Mac") endif() # 判断文件/目录是否存在 if(EXISTS ${PROJECT_SOURCE_DIR}/include)

4.3 逻辑运算

·AND并且

·OR或者

·NOT取反

if(WIN32 AND EXISTS ${PROJECT_SOURCE_DIR}/lib)

5. 循环

# 遍历文件列表 foreach(file ${SRCS}) message("文件: ${file}") endforeach() # 数字遍历 1~5 foreach(i RANGE 1 5) message("数字: ${i}") endforeach()

6. 打印信息

message("普通日志") message(STATUS "状态信息") # 标准输出 message(WARNING "警告") message(FATAL_ERROR "致命错误,终止编译")