当前位置: 首页 > news >正文

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 "致命错误,终止编译")
http://www.jsqmd.com/news/1096895/

相关文章:

  • 【MATLAB】无人机编队故障成员替换重构策略
  • 掌握Vue3 第二十四章:解锁兄弟组件通信的两种高效模式
  • 告别手写!用Playwright Codegen录制脚本,5分钟搞定Web自动化测试
  • windows怎么打开后缀为epub的文件
  • 若依Vue3框架:深度解析侧边栏菜单的默认展开与状态管理
  • Kali APT 仓库数字签名缺失:从报错到安全更新的解决之道
  • 深度解析:如何实现浏览器Cookie安全本地化导出的终极方案
  • 射频天线设计实战:从S11、VSWR到RL,一文读懂匹配性能核心指标
  • 从原理图到示波器:imx6ull开发板PWM输出全流程实战解析
  • 基于MATLAB机器人工具箱的SCARA机器人D-H建模与轨迹规划实战
  • 交易所系统开发:搭建指南与功能步骤详解
  • Logisim实战:从零构建32位MIPS ALU运算器
  • MOE实战:从复合物结构到稳定构象的分子动力学模拟全流程
  • SAP FICO 后台配置实战:从零搭建财务核心框架
  • 【Unity3D】从零到一:打造可自定义的记忆翻牌小游戏
  • Qt实战:从C2001“常量中有换行符”错误,解析MSVC编译下的UTF-8编码陷阱与根治方案
  • ArkTS 页面路由完整写法
  • 嵌入式开发的终极图像转换方案:如何用LCD Image Converter节省80%的Flash存储空间
  • STM32实现高精度NTP网络授时:从协议解析到本地时间转换
  • 截痕法解析二次曲面:从旋转曲面到锥面的几何构建
  • Code::Blocks新手避坑指南:从零配置MinGW编译器,彻底告别“GNU GCC Compiler is invalid”
  • Eggo控制平面部署:Master节点的自动化安装与配置终极指南
  • HoRain云--Java数值处理:Number与Math全解析
  • DSP在线升级(2)--Bootloader的模块化设计与通信协议集成
  • 华硕笔记本终极优化工具:G-Helper轻量控制中心完整指南
  • Citra模拟器完全指南:在PC上畅玩任天堂3DS游戏的终极教程
  • ESP8266点对点通信实战:从AT指令到数据透传
  • VDA 2 第六版深度解析:数字化时代下PPA(生产过程和产品批准)的标准化实践与合规保障
  • 多目标跟踪(二)DeepSort——级联匹配Matching Cascade的工程实践与调优
  • 鸿蒙 App 如何设计 Agent Bus?一文讲透智能体通信机制