Qt Cmake之路(一):Cmake变量语法

由于Qt6之后cmake逐渐取代了qmake,camke成为了不可或缺的构建手段。Qt版本为6.5.3+Qt Creator 18.0.0。

Qt项目创建时,可以选择构建方式,当选择cmake时,会默认创建一个cmakelist.txt文件。cmake语法熟练后,也可以手动创建,设置一些基本项,然后导入项目。

这里岔开一个小话题,个人习惯比较喜欢子目录结构管理多个项目,但是子目录项目还是默认只支持qmake。但是我们可以在子目录项目导入已经存在的cmake构建项目,问题不大。

一 cmake定义变量语法

1.1 定义变量

复制代码
# 基本语法
set(VARIABLE_NAME value)

# 示例
set(MY_PROJECT_NAME "MyApp")
set(VERSION_MAJOR 1)
set(VERSION_MINOR 0)
set(VERSION_PATCH 0)

# 字符串变量
set(STRING_VAR "Hello World")

# 列表变量(多种方式)
set(LIST_VAR item1 item2 item3)
set(LIST_VAR "item1;item2;item3")
set(LIST_VAR item1 item2 item3)

1.2 缓存变量(可在命令行或GUI中修改)

复制代码
# 语法:set(VAR VALUE CACHE TYPE "描述" [FORCE])
set(USE_QT6 ON CACHE BOOL "是否使用Qt6")
set(INSTALL_PREFIX "/usr/local" CACHE PATH "安装路径")
set(BUILD_TYPE "Release" CACHE STRING "构建类型")

# 强制更新缓存变量
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "构建类型" FORCE)

1.3 环境变量

复制代码
# 设置环境变量(仅对CMake进程有效)
set(ENV{PATH} "$ENV{PATH}:/opt/myapp/bin")

# 读取环境变量
set(QT_DIR $ENV{QTDIR})

1.4 条件设置变量

复制代码
# 根据条件设置变量
if(WIN32)
    set(EXECUTABLE_NAME "myapp.exe")
else()
    set(EXECUTABLE_NAME "myapp")
endif()

# 使用option定义选项
option(BUILD_TESTS "构建测试程序" ON)
option(USE_CUDA "使用CUDA加速" OFF)

1.5 变量作用域

复制代码
# 局部变量(当前目录和子目录)
set(MY_VAR "value")

# 全局变量(整个项目)
set(MY_GLOBAL_VAR "global" CACHE INTERNAL "")

# 父作用域变量
set(PARENT_VAR "parent" PARENT_SCOPE)

变量操作和引用

2.1 引用变量

复制代码
# 使用${}引用变量
message("项目名: ${MY_PROJECT_NAME}")
message("版本: ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")

# 列表引用
set(FILES main.cpp widget.cpp dialog.cpp)
message("文件数: ${FILES}")
message("第一个文件: ${FILES_0}")  # 注意:列表索引是_0

2.2. 字符串操作

复制代码
# 字符串拼接
set(FULL_NAME "${FIRST_NAME} ${LAST_NAME}")

# 转换为大写/小写
string(TOUPPER ${MY_VAR} UPPER_VAR)
string(TOLOWER ${MY_VAR} LOWER_VAR)

# 字符串长度
string(LENGTH ${MY_VAR} VAR_LENGTH)

2.3. 列表操作

复制代码
# 列表操作
list(APPEND SOURCES main.cpp widget.cpp)
list(REMOVE_ITEM SOURCES widget.cpp)
list(LENGTH SOURCES NUM_SOURCES)

# 遍历列表
foreach(ITEM ${SOURCES})
    message("文件: ${ITEM}")
endforeach()

三 内置目录变量

3.1 常用的CMake目录变量

变量 说明
CMAKE_SOURCE_DIR 源代码树的顶层目录
CMAKE_BINARY_DIR 构建树的顶层目录
PROJECT_SOURCE_DIR 当前项目的源代码目录
PROJECT_BINARY_DIR 当前项目的构建目录
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在目录
CMAKE_CURRENT_BINARY_DIR 当前目标的构建目录

3.2 传统构建方式

复制代码
# 在项目根目录执行
mkdir build
cd build
cmake ..
make
  • CMAKE_SOURCE_DIR: /home/user/myproject

  • CMAKE_BINARY_DIR: /home/user/myproject/build

  • PROJECT_SOURCE_DIR: /home/user/myproject

  • PROJECT_BINARY_DIR: /home/user/myproject/build

3.3 现代构建方式

复制代码
# 在任何位置执行
cmake -B /tmp/build -S /home/user/myproject
cmake --build /tmp/build
  • CMAKE_SOURCE_DIR: /home/user/myproject

  • CMAKE_BINARY_DIR: /tmp/build

  • PROJECT_SOURCE_DIR: /home/user/myproject

  • PROJECT_BINARY_DIR: /tmp/build

相关推荐
蜡笔小马2 分钟前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
IOsetting2 分钟前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
林开落L16 分钟前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
牛奔21 分钟前
Go 是如何做抢占式调度的?
开发语言·后端·golang
符哥200829 分钟前
C++ 进阶知识点整理
java·开发语言·jvm
小猪咪piggy29 分钟前
【Python】(4) 列表和元组
开发语言·python
難釋懷42 分钟前
Lua脚本解决多条命令原子性问题
开发语言·lua
CoderCodingNo1 小时前
【GESP】C++ 二级真题解析,[2025年12月]第一题环保能量球
开发语言·c++·算法
独好紫罗兰1 小时前
对python的再认识-基于数据结构进行-a005-元组-CRUD
开发语言·数据结构·python
LYOBOYI1231 小时前
qtcpSocket详解
c++·qt