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 "致命错误,终止编译")