CMake简单入门

简介

CMake 是一个开源的跨平台构建系统生成工具,旨在简化和自动化项目的构建过程。它主要用于管理和控制软件构建的过程,特别是在处理复杂的项目结构和多个平台时。CMake 并不直接进行编译或链接,而是生成本地构建系统所需的文件(如 Makefile、Visual Studio 项目文件、Xcode 工程文件等),然后由这些工具进行实际的构建。

特点

  1. 跨平台支持: CMake 支持多种操作系统和编译器,包括 Windows、Linux、macOS、Android、iOS 等。它可以生成适应不同平台的构建文件,如 Makefile、Visual Studio、Xcode 工程文件等。
  2. 生成构建系统文件: CMake 通过读取 CMakeLists.txt 配置文件,生成适合目标平台的构建系统文件。这些文件可以是:
    • Makefile:用于 Linux 或类 Unix 系统上的构建。
    • Visual Studio 项目文件:用于 Windows 上的 Visual Studio 环境。
    • Xcode 工程文件:用于 macOS 上的 Xcode 工具链。
  3. 易于管理复杂项目: CMake 允许你将项目分解为多个子模块(subdirectories),每个子模块都可以有自己的 CMakeLists.txt 文件,从而使得管理大项目变得更加简单。例如,CMake 可以方便地处理项目中的静态库、动态库和可执行文件的构建。
  4. 支持外部依赖管理: CMake 通过 find_package() 来查找和配置项目所依赖的外部库和工具。例如,可以查找 Qt、OpenGL、Boost 等库,并自动配置其路径。
  5. 支持多种编译选项: CMake 允许设置编译器标志、优化级别、编译标准等,可以方便地支持 Debug 和 Release 模式的切换。
  6. 简化配置和构建: CMake 使得配置和构建流程简化为几条命令,避免了手动修改和维护平台特定的构建脚本。

基本概念

  1. CMakeLists.txt: CMake 项目中的核心文件是 CMakeLists.txt。它用于定义构建系统的规则,包括项目的源文件、依赖库、编译选项、构建目标等。一个 CMake 项目通常会有多个 CMakeLists.txt 文件,每个子目录都有一个 CMakeLists.txt 文件。

  2. 项目结构: CMake 项目的结构通常包含:

    • CMakeLists.txt:用于配置项目的根目录文件。
    • src/:源代码文件夹。
    • build/:用于存放构建过程中生成的文件。
    • include/:头文件目录。
    • lib/:库文件目录。

    示例结构:

    project/
    ├── CMakeLists.txt
    ├── src/
    │   ├── main.cpp
    │   └── other.cpp
    ├── include/
    │   └── header.h
    └── lib/└── library.a
    
  3. CMake 语法: CMake 使用一组简单的命令和语法,常见的命令包括:

    • cmake_minimum_required(VERSION 3.16):设置 CMake 的最低版本要求。
    • project(MyProject):定义项目的名称。
    • add_executable(MyExecutable main.cpp):定义一个可执行文件。
    • target_link_libraries(MyExecutable MyLibrary):链接库。
    • find_package(Qt5 REQUIRED):查找外部库(如 Qt)。
    • include_directories(path):指定头文件路径。
    • set(VAR value):定义变量。
    • add_subdirectory(path):处理子目录的 CMakeLists.txt 文件。

实际例子:

project/
├── CMakeLists.txt  # 根目录
├── card/
│   └── CMakeLists.txt  # card 子模块
└── player/└── CMakeLists.txt  # player 子模块

当前有一个包含多个模块(cardwindows 等)和依赖项(如 Qt)的项目,以下是从头到尾的构建流程:

  1. CMake 配置阶段
    • CMake 会扫描根目录的 CMakeLists.txt 文件,处理项目设置。
    • CMake 会依次处理每个子模块的 CMakeLists.txt 文件。
    • 例如,在 card 子目录下,CMake 会生成一个名为 card 的静态库,链接 Qt 核心库。
    • 根目录会通过 target_link_libraries() 连接各个模块,例如将 card 和其他模块(如 windows)链接到主程序 client
  2. 编译阶段
    • 运行 makecmake --build . 命令,编译器会将源文件编译成目标文件。
    • 每个 .cpp 文件都会生成一个 .o.obj 文件。
  3. 链接阶段
    • 链接器将目标文件和静态库/动态库链接成最终的可执行文件。
    • 如果 card 是静态库,链接器会将 card 库的代码和目标文件合并。
    • 如果依赖了动态库(如 Qt),链接器会将动态库的路径信息嵌入可执行文件。
  4. 生成可执行文件
    • 最终的 client 可执行文件会被生成。
  5. 安装阶段
    • 可执行文件和库文件(如果有的话)会被安装到指定的目录,准备部署和使用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++基础笔记

1. C关键字 这个不多说,以后接触得到,但这里做个总结: 2. 命名空间 一般类型: namespace Xianyu {// 命名空间中可以定义变量/函数/类型int rand 10;int Add(int left, int right){return left right;}struct Node{struct No…

生活中的可靠性小案例12:类肤材质老化发粘问题

我一直觉得我买的某品牌车载吸尘器很好用,用了几年,目前性能也是杠杠的。然而它现在有个最大的问题,就是表面发粘了,用起来粘手,非常不舒服。 这一类问题在生活中不少见,尤其是一些用了类肤材质涂层的物件。…

黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)

文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明&#xff0c;告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素&#xff0c;设置文档语言为英语 --><head> <!-- 头部区域&am…

Ollama+OpenWebUI本地部署大模型

OllamaOpenWebUI本地部署大模型 前言Ollama使用Ollama安装Ollama修改配置Ollama 拉取远程大模型Ollama 构建本地大模型Ollama 运行本地模型&#xff1a;命令行交互Api调用Web 端调用 总结 前言 Ollama是一个开源项目&#xff0c;用于在本地计算机上运行大型语言模型&#xff0…

【NeurIPS 2024】LLM-ESR:用大语言模型破解序列推荐的长尾难题

标题期刊年份关键词LLM-ESR: Large Language Models Enhancement for Long-tailed Sequential RecommendationNeurIPS2024Large Language Models, Sequential Recommendation, Long-tailed &#x1f4da;研究背景 在电商和社交媒体的世界里&#xff0c;序列推荐系统&#xff…

C语言_数据结构总结9:树的基础知识介绍

1. 树的基本术语 - 祖先&#xff1a;考虑结点K&#xff0c;从根A到结点K的唯一路径上的所有其它结点&#xff0c;称为结点K的祖先。 - 子孙&#xff1a;结点B是结点K的祖先&#xff0c;结点K是B的子孙。结点B的子孙包括&#xff1a;E,F,K,L。 - 双亲&#xff1a;路径上…

Android 14 Telephony 网络选择功能介绍

一、总体介绍 (一)功能 手动搜网的流程:用户通过UI触发,调用TelephonyManager的API,比如startNetworkScan,然后这个请求会传递到RIL层,通过AT命令与基带通信,进行网络扫描。结果返回后,经过TelephonyRegistry通知应用层。中间可能涉及IPC,比如Binder通信,因为应用和…

系统思考全球化落地

感谢加密货币公司Bybit的再次邀请&#xff0c;为全球团队分享系统思考课程&#xff01;虽然大家来自不同国家&#xff0c;线上学习的形式依然让大家充满热情与互动&#xff0c;思维的碰撞不断激发新的灵感。 尽管时间存在挑战&#xff0c;但我看到大家的讨论异常积极&#xff…

位运算(基础算法)

按位与AND&#xff08; & &#xff09; 只有当两个位都为1时&#xff0c;结果才为1,否则为0。结果不会变大 按位或 OR&#xff08; | &#xff09; 只有当两个位中有一个为1时&#xff0c;结果才为1,否则为0。结果不会变小 按位异或 XOR &#xff08; ^ &#xff09; 只…

规模效应的三重边界:大白话解读-deepseek为例

前言&#xff1a;当Scaling Laws遇见边际递减效应 在人工智能的狂飙突进中&#xff0c;大语言模型如同不断膨胀的星体&#xff0c;吞噬着海量算力与数据。OpenAI于2020年揭开的Scaling Laws&#xff0c;曾为这场盛宴指明方向&#xff1a;模型性能随参数规模&#xff08;N&…

力扣143重排链表

143. 重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的…

wow-rag:task3-初步体验问答引擎

做RAG需要自己准备一个txt文档&#xff0c;新建一个docs文件夹&#xff0c;放进去。例如&#xff0c;这里放了一个./docs/问答手册.txt # 从指定文件读取&#xff0c;输入为List from llama_index.core import SimpleDirectoryReader,Document documents SimpleDirectoryRead…

bgp服务器是什么意思

一、基础概念 ‌BGP服务器‌&#xff08;Border Gateway Protocol Server&#xff09;指通过 ‌边界网关协议&#xff08;BGP&#xff09;‌ 实现 ‌多运营商线路智能调度‌ 的服务器&#xff0c;能够自动选择最优路径连接不同网络&#xff08;如电信、联通、移动&#xff09;…

AtCoder Beginner Contest 397(ABCDE)

目录 A - Thermometer 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; B - Ticket Gate Log 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; C - Variety Split Easy 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; D - Cubes 翻译&#xff1a…

unserialize3 [有难度,序列化反序列化知识点]

详情: 地址:https://adworld.xctf.org.cn/challenges/list (unserialize3) 看到题目名称是反序列化 代码审计 <?php class xctf{// 定义一个公有属性$flag&#xff0c;通常CTF题目中需要获取该属性值public $flag 111; // 此处为示例值&#xff0c;实际可能为真实flag/*…

【Linux-传输层协议TCP】TCP协议段格式+确认应答+超时重传+连接管理机制(三次握手、四次挥手、理解TIME_WAIT + CLOSE_WAIT)

TCP协议 TCP全称为“传输控制协议&#xff08;Transmission Control Protocol&#xff09;”人如其名&#xff0c;要对数据的传输进行一个详细的控制。 1.TCP协议段格式 下面是TCP报头各个字段的表格形式&#xff1a; 字段名称字段大小描述源端口16位发送端TCP端口号。目的端…

《AI大模型趣味实战》No2 : 快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色(中)

快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色(中) 摘要 在上一篇文章中&#xff0c;我们介绍了如何搭建一个基础的家庭网站&#xff08;V1.0版本&#xff09;&#xff0c;包含了用户管理、相册管理、时间线和日历等功能。本文将继续深入&#xff0c;详细…

React(二):JSX语法解析+综合案例

事件绑定 this绑定方式 问题&#xff1a;在事件执行后&#xff0c;需获取当前类的对象中相关属性&#xff0c;此时需要this——当打印时&#xff0c;发现this为undefined,这又是为啥&#xff1f; 假设有一个btnClick函数&#xff0c;但它并不是我们主动调用的&#xff0c;而是…

One of the configured repositories failed (未知), and yum doesn‘t have enough cached data to continue

centos操作系统运行yum命令是出现如下报错&#xff1a; 解决办法&#xff1a; 由于CentOS的源地址内容已移除&#xff0c;CentOS 操作系统结束了生命周期&#xff0c;源地址内容已移除。 只需要将它的base源换成其他可用源&#xff0c;我这里将它换成了阿里的base源 备份原来…

【蓝图使用】绘制mesh顶点的法线

文章目录 绘制法线Normal准备工作UE5资源制作蓝图制作 参考 绘制法线Normal 参考[1]打算用蓝图走一遍渲染管线&#xff0c;还是可以的 准备工作 Blender制作一个三个顶点的模型 要不要材质无所谓&#xff0c;就一个三个顶点的mesh即可&#xff0c;参考[2] 找到一个法线贴…