cmake总结

注意:1、cmake的内置命令是不区分大小写的,但是cmake的变量是区分大小写的,一般内置变量是大写的。

2、cmake的文档中<xxx>表示必选参数,[xxx]表示可选参数,...用于修饰它前面的那个参数,表示前面的参数可以跟一个或多个同类型参数,它们之间需要用空格分隔。

介绍:CMake 是一个 跨平台的构建系统生成器,它不是构建工具、也不是编译器,CMake 本身不直接编译代码、不直接链接程序。 它是通过编写一份统一的 CMakeLists.txt 配置文件,然后根据这份文件,自动生成适合平台的构建系统文件(如 Makefile)。

优点:

1、跨平台支持。CMake 支持多种操作系统和编译器,使得同一份构建配置可以在不同的环境中使用。

2、简化配置: 通过 CMakeLists.txt 文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本。

3、自动化构建: CMake 能够自动检测系统上的库和工具,减少手动配置的工作量。

4、灵活性: 支持多种构建类型和配置(如 Debug、Release),并允许用户自定义构建选项和模块。

参考文档

编译流程见https://www.runoob.com/cmake/cmake-build-demo.htmlhttps://www.runoob.com/cmake/cmake-build-demo.html

常见语法

变量相关

1、变量赋值

set(<variable> <value>...);给变量赋值,如果这个变量没定义就自动定义它。比如set(aa 10)表示给aa赋值为10.

2、变量使用

(变量名)表示将(变量名)替换成变量值,特别注意在if语句中使用变量不需要加$。

条件语句

if(expression)

Commands

elseif(expression)

Commands

else()

Commands

endif()

常用指令

add_subdirectory(plugin);表示在子目录plugin找到CmakeLists.txt文件,然后执行它。

cmake_minimum_required(VERSION <version>);指定最小版本号。<version>填cmake版本号。

project(<project_name> [<language>...]);定义项目的名称和使用的编程语言。比如project(MyProject CXX)。

add_executable(<target> <source_files>...);把源文件编译成可执行文件。比如

add_executable(MyExecutable main.cpp other_file.cpp)表示将main.cpp和other_file.cpp文件编译成名为MyExecutable的可执行文件。

add_library(<target> [<type>] <source_files>...);将源文件编译成库,static表示编译成静态库,share表示编译成动态库。比如add_library(MyLibrary STATIC library.cpp one.cpp)表示将library.cpp和one.cpp编译成名为MyLibrary的静态库。

target_link_libraries(<target> <libraries>...);给已目标绑定依赖关系,目标可以是可执行文件或库文件。比如target_link_libraries(Demo MathLib UtilsLib)表示给可执行程序Demo,链接静态库MathLib和动态库UtilsLib。

include_directories(<dirs>...);用于指定头文件搜素路径,路径可以是相对路径也可以是绝对路径,路径之间用空格隔开,它指定的头文件路径是全局生效的,因此它有一个弊端就是项目中不能存在同文件名的头文件,这是由于编译器执行 #include "uart.h" 时,会按照 include_directories 写的路径顺序依次搜索,如果头文件名相同,那么可能你想引用的是common/uart.h,但实际引用的是bsp/uart.h。接下来举个使用它的例子,比如include_directories(. bsp common)表示头文件搜索路径为当前目录和bsp以及common文件夹。

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]);只给指定的单个目标配置头文件搜索路径,只对这个目标生效,其他目标完全不受影响,精准、干净、无污染。PRIVATE表示头文件路径,仅当前目标自己使用,不会传递给任何下游目标;PUBLIC表示添加的头文件路径,当前目标自己能用,同时也会传递给所有下游目标。注意这个指令必须写在 add_* 指令之后,因为运行了add_*指令后才有目标文件。

相关推荐
树℡独4 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
小小管写大大码4 小时前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
嵩山小老虎4 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模5 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
zhang133830890755 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
a41324475 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler5 小时前
buildroot System configuration
java·服务器·数据库
津津有味道5 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.6 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
物联网软硬件开发-轨物科技6 小时前
【轨物洞见】告别“被动维修”!预测性运维如何重塑老旧电站的资产价值?
运维·人工智能