CMake 使用详解

news2024/12/12 10:51:45

CMake 是一种跨平台的构建系统工具,用于管理软件项目的构建过程。
它通过描述项目的构建配置生成本地构建系统文件(如 Makefile 或 Visual Studio 工程文件)。

核心概念

  1. CMakeLists.txt
    每个项目目录都需要一个 CMakeLists.txt 文件来定义构建规则。它是 CMake 的核心配置文件,描述了目标、依赖关系和构建步骤。
  2. 构建目录
    CMake 通常在一个单独的目录中生成构建文件,保持源代码目录干净。
  3. 生成器(Generator)
    CMake 根据目标平台和构建工具生成对应的构建文件。例如:
  • Unix Makefiles
  • Ninja
  • Visiual Studio 工程文件
  1. 目标(Targets)
    CMake 使用目标(如库和可执行文件)来组织构建过程。常见的目标包括 add_executableadd_library

基本语法

配置和版本要求

cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0 LANGUAGES CXX)

添加可执行文件或库

add_executable(MyApp main.cpp)
add_library(MyLib STATIC mylib.cpp)

指定源文件

可以直接写文件名或用变量引用:

set(SOURCES main.cpp helper.cpp)
add_executable(MyApp ${SOURCES})

链接库

target_link_libraries(MyApp PRIVATE MyLib)

设置编译选项

target_compile_options(MyApp PRIVATE -Wall -Wextra)

指定头文件目录

target_include_directories(MyApp PRIVATE include)

常用命令

  1. 项目管理
  • project():设置项目名称和属性。
  • set():定义变量。
  1. 构建目标
  • add_executable()add_library()
  • target_sources():动态添加源文件。
  • target_compile_definitions():定义宏。
  1. 依赖管理
  • find_package():查找已安装的包。
  • find_library():查找已安装的库。
  • find_path():查找包含目录。
  1. 条件逻辑
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
	message("Building for Linux")
endif()
  1. 自定义命令
add_custom_command(
	OUTPUT generated_file.cpp
	COMMAND python generate_code.py
	DEPENDS generate_code.py
)
  1. 安装和打包
  • install():定义安装规则。
  • cmake --install: 安装到目标路径。
  • 打包工具如 CPack 用于生成 .deb.rpm 文件。

常见 CMake 变量

  1. 全局变量
  • CMAKE_C_COMPILER: 设置 C 编译器。
  • CMAKE_BUILD_TYPE:构建类型(如 Debug、Release)。
  • CMAKE_INSTALL_PREFIX:安装路径。
  1. 目标相关变量
  • CMAKE_CXX_STANDARD: C++ 标准(如11、14、17)。
  • CMAKE_RUNTIME_OUTPUT_DIRECTORY:可执行文件输出路径。
  1. 项目相关变量
  • PROJECT_SOURCE_DIR:源码根目录。
  • PROJECT_BINARY_DIR:构建目录。

CMake 构建过程

  1. 配置阶段
    执行以下命令生成构建文件:
cmake -S . -B build

-S 指定源码路径,-B 指定构建路径。

  1. 构建阶级
    使用生成的构建文件进行编译:
cmake --build build
  1. 安装阶段
    安装生成的文件到指定目录:
cmake --install build --prefix /path/to/install

示例:完整的 CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0 LANGUAGES CXX)

# 设置 c++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 添加可执行文件
add_executable(MyApp main.cpp)

# 链接外部库
find_package(Boost REQUIRED)
target_link_libraries(MyApp PRIVATE Boost::Boost)

# 设置安装规则
install(TARGETS MyApp DESTINATION bin)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对于相同问题大模型的生成为什么会不同?

AI因你而升温,记得加个星标哦! 大模型的输出是一个token一个token的进行逐步输出,在输出策略上可分为两大类: 贪心解码:直接选择概率最高的单词。这种方法简单高效,但是可能会导致生成的文本过于单调和重复…

12.11作业

1.脑图 定义一个数组,用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息,删除后调用显示学生信息函数 显示 4> 封…

C++11 常用-新特性

一、原始字面量——原文链接 原始字面量 R可以直接得到其原始意义的字符串(用于简化:win路径转换、字符串换行需要加连接符) 定义方式 //R “xxx(原始字符串)xxx”//这种情况原本在 win下是需要使用\\的 string str2 R"(D:\hello\worl…

独家首发 | 基于 2D-SwinTransformer + BiGRU-GlobalAttention的并行故障诊断模型

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

ESP32-C3 入门笔记07: ESP-NOW动态绑定MAC地址. (ESP-IDF + VSCode)

ESP-NOW 简介 ESP-NOW [gitbuh] ESP-NOW 是一种由乐鑫公司定义的无连接 Wi-Fi 通信协议。在 ESP-NOW 中,应用程序数据被封装在各个供应商的动作帧中,然后在无连接的情况下,从一个 Wi-Fi 设备传输到另一个 Wi-Fi 设备。 CTR 与 CBC-MAC 协…

《Java核心技术I》并行数组算法

并行数组算法 Arrays类提供了大量并行化操作。 Arrays.parallelSort方法可以对一个基本类型值或对象的数组排序。 package arrays;import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import …

智创 AI 新视界 -- AI 助力金融风险管理的新策略(16 - 10)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

ASP.NET |日常开发中连接Oracle数据库详解

ASP.NET |日常开发中连接Oracle数据库详解 前言一、安装和配置 Oracle 数据访问组件1.1 安装ODP.NET(Oracle Data Provider for.NET):1.2 引用相关程序集: 二、配置连接字符串2.1 连接字符串的基本组成部分&#xff1a…

ChatGPT 4:解锁AI文案、绘画与视频创作新纪元

文章目录 AI文案:激发文字的魅力,重塑营销与传播AI绘画:解锁艺术的无限可能,激发创意灵感AI视频:重塑视频创作流程,提升制作效率GPTs:构建个性化AI应用,赋能各行各业《ChatGPT 4 应用…

使用html 和javascript 实现微信界面功能1

1.功能说明: 搜索模块: 提供一个搜索框,但目前没有实现具体的搜索功能。 好友模块: 在左侧的“好友”部分有一个“查看好友”按钮。点击左侧的“查看好友”按钮时,会在右侧显示所有好友的列表。列表中每个好友可以点击查看详情,包…

常用的注解

RequestMapping 用于映射请求路径 可以添加在类或方法上 请求类型 请求类型包括GET、POST、PUT、DELETE等 默认支持GET和POST两种方式 简写:GetMapping、PostMapping、PutMapping、DeleteMapping PostMapping("/buy") 等价 RequestMapping("/buy&quo…

【操作系统】实验二:观察Linux,使用proc文件系统

实验二 观察Linux,使用proc文件系统 实验目的:学习Linux内核、进程、存储和其他资源的一些重要特征。读/proc/stat文件,计算并显示系统CPU占用率和用户态CPU占用率。(编写一个程序使用/proc机制获得以及修改机器的各种资源参数。…

Mysql体系架构剖析——岁月云实战笔记

1 体系架构 理论内容阅读了mysql体系架构剖析,其他的根据岁月云的实战进行记录。 1.1 连接层 mysql最上层为连接服务,引入线程池,允许多台客户端连接,主要工作:连接处理、授权认证、安全防护、管理连接等。 连接处理&a…

算法基础Day7(动态规划)

文章目录 1.题目2.题目解答1.第N个泰波那契数题目及题目解析动态规划算法学习1.状态表示2.状态转移方程3.初始化4.填表顺序5.空间优化 代码提交空间优化 2.三步问题题目及题目解析算法学习代码提交 1.题目 1137. 第 N 个泰波那契数 - 力扣(LeetCode)面试…

Python基础笔记17--面向对象(其他)

一、面向对象的三大特性 1、封装 1、 将属性和⽅法书写到类的⾥⾯的操作 2、封装可以为属性和⽅法添加私有权限 2、继承 1、⼦类默认继承⽗类的所有属性和⽅法 2、⼦类可以重写⽗类属性和⽅法 3、多态 1、 传⼊不同的对象,产⽣不同的结果 二、多态 多态指⼀类事…

梳理你的思路(从OOP到架构设计)_基本OOP知识03

目录 1、<基类/子类 >结构的接口(卡榫函数) 1&#xff09;卡榫(Hook) 2&#xff09;卡榫函数的Java实现 2、IoC机制与基於 Default 軟硬整合觀點 函数 1&#xff09;卡榫函数实现IoC机制 2&#xff09;默认(Default)行为 1、<基类/子类 >结构的接口(卡榫函数…

Y3编辑器官方文档1:编辑器简介及菜单栏详解(文件、编辑、窗口、细节、调试)

文章目录 一、新建项目二、 编辑器主界面2.1 游戏场景2.2 导航栏/菜单栏2.3 功能栏三、菜单栏详细介绍3.1 文件3.1.1 版本管理3.1.2 项目管理(多关卡)3.1.2.1 多关卡功能说明3.1.2.2 关卡切换与关卡存档3.2 编辑3.2.1 通用设置3.2.2 键位设置3.3 窗口(日志)3.4 细节3.4.1 语言…

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因&#xff1a;解决方案&#xff1a; 今天刚遇到的问题&#xff0c;横屏的页面完成操作后跳转页面后&#xff0c;自定义的tabbar样式乱了&#xff0c;跑到最顶了&#xff0c;真机调试后发现navbar跑到手机状态栏了&#xff0c;它正常应该跟右边胶囊一行。 知道问…

十五、K8s计划任务JobCronJob

K8s计划任务CronJob&Job 一、Job可以干什么 Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 pod,这个 pod 专门用来备份用的,备份结束 pod 就可以终止了,不需要重启,而是将 Pod…

【开源】基于SpringBoot框架美容院管理系统(计算机毕业设计)+万字说明文档 T012

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…