CMake学习
向大佬lyf学习,先把其8服务器中所授fine
文章目录
- 前言
- 一、CMakeList.txt 命令
- 1. 最外层CMakeLists
- 1.1 cmake_minimum_required()
- 1.2 project()
- 1.3 set()
- 1.4 add_subdirectory()
- 2. 内层CMakeLists
- 二、clangd 如何使用 compile_commands.json
- 2.1 compile_commands.json
- 2.2 clangd利用compile_commands.json
- 三、静态库和动态库
- 3.1 静态库(Static Library)
- 3.2 动态库(Shared Library 或 Dynamic Library)
- 总结
前言
不能光写代码,也需要提升宏观的工程能力,
还是那句话,深度。
一、CMakeList.txt 命令
1. 最外层CMakeLists
1.1 cmake_minimum_required()
指定项目所需的 CMake 最低版本。如果当前 CMake 版本低于指定版本,CMake 会发出错误并停止配置过程。
通过指定最低版本,可以确保项目使用的 CMake 功能和特性在该版本中可用,从而避免因版本不兼容而导致的问题。
1.2 project()
定义一个项目的名称和相关信息
project() 命令会生成一些有用的变量,如:
PROJECT_NAME: 项目名称。
PROJECT_SOURCE_DIR: 项目源代码的根目录。
PROJECT_BINARY_DIR: 项目构建目录。
1.3 set()
用于为 CMake 脚本中的变量赋值,可以为 CMake 自带的变量(如 CMAKE_CXX_FLAGS_DEBUG、CMAKE_BUILD_TYPE)或用户自定义的变量赋值
典型的用法是 set(变量名 值),通过这种方式将某个值赋给 CMake 中的某个变量。
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG")
如此处,是将"$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG"赋给CMAKE_CXX_FLAGS_DEBUG ,CMAKE_CXX_FLAGS_DEBUG 是CMake内部变量,是 CMake 提供的一个预定义变量,它专门用于存储在 Debug 构建类型 下(即 CMAKE_BUILD_TYPE 设置为 Debug 时)的编译器选项
ENV是系统环境变量,在linux中可以通过printenv来查看env信息,如果 $ ENV{CXXFLAGS}没找到CXXFLAGS的话,就会返回空字符串从而直接将-O0 -Wall -g -ggdb -DDEBUG赋给CMAKE_CXX_FLAGS_DEBUG
这句话在 CMake 中的作用是为 C++ 编译器设置在 Debug 模式下的编译标志
“$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG”:
- $ENV{CXXFLAGS}:这是 CMake 语法,用于从操作系统的环境变量 CXXFLAGS 中读取值。如果 CXXFLAGS 存在,它的值会被插入到这个位置;如果不存在,这部分将为空。
- -O0:关闭优化。Debug 模式下,编译器不会优化代码,这样可以让代码结构尽量保持原样,以便调试。
- -Wall:启用所有常规警告。编译器会输出所有常见的潜在问题警告,帮助开发者发现代码中的潜在错误。
- -g:生成调试信息。这会让编译器在生成的可执行文件中包含调试符号,以便在调试器(如 GDB)中使用。
- -ggdb:为 GDB 调试器生成更多的调试信息,优化调试体验。
-DDEBUG:定义 DEBUG 宏。在代码中,可能会有一些只在 Debug 模式下执行的代码,通过 #ifdef DEBUG 进行条件编译,这个宏可以帮助启用这些代码块。
1.4 add_subdirectory()
add_subdirectory(src) 是 CMake 中的一个命令,用于将指定的子目录(这里是 src 目录)添加到当前 CMake 项目中。CMake 会递归地处理该子目录中的 CMakeLists.txt 文件,并将该目录中的构建目标、编译选项等内容合并到主项目中
2. 内层CMakeLists
二、clangd 如何使用 compile_commands.json
2.1 compile_commands.json
compile_commands.json 中的每条记录都包含三个重要的字段:
directory:编译时的工作目录。
command:完整的编译命令,包含编译器、编译选项、头文件搜索路径、宏定义等。
file:源文件的路径。
这三个字段的作用如下:
directory:表示运行编译命令时的当前目录。编译器通常会使用这个目录作为基准来解析相对路径的头文件或者依赖文件路径。clangd 通过这个字段确保在正确的目录下解析文件路径,正确查找头文件等依赖项。
command:这个字段是实际用于编译该源文件的完整命令行。它包括:
编译器路径(如 /usr/bin/g++),clangd 使用这个信息来模拟真实的编译环境。
编译选项(如 -Wall, -O2, -g),这些选项会影响 clangd 如何解析代码。
头文件包含路径(如 -I/path/to/includes),clangd 通过这些选项能够找到头文件,并理解项目的依赖关系。
宏定义(如 -DDEBUG),这些定义会影响代码的编译和行为,clangd 使用这些定义来精确解析带有条件编译的代码。
file:表示当前需要编译的源文件。clangd 通过这个字段知道要解析和分析哪个源文件。
2.2 clangd利用compile_commands.json
-
解析 compile_commands.json 文件
当你在某个项目中使用 clangd 时,clangd 会首先查找并解析构建目录中的 compile_commands.json 文件。每一条记录代表一个源文件的编译命令,clangd 会根据需要处理不同的源文件。 -
智能跳转
智能跳转是指当你在编辑器中点击某个符号(如函数、变量、类名等)时,clangd 能够跳转到符号的定义或声明处。为了做到这一点,clangd 需要完整解析代码的上下文,这就依赖于正确的编译配置。具体过程如下:
通过 compile_commands.json 中的 file 字段找到对应的源文件。
从 directory 字段得知该文件的工作目录,并进入该目录,确保相对路径能够正确解析。
通过 command 字段获取完整的编译命令,解析头文件路径、宏定义等编译选项。
使用这些信息构建编译环境,然后解析源文件,构建符号表。
当用户点击某个符号时,clangd 利用解析的符号表找到其定义或声明,并跳转到对应的位置。 -
代码补全
代码补全功能依赖于对代码的准确解析。在编辑器中,当你输入一个变量或对象名称时,clangd 可以根据上下文提供可能的补全项。为了提供精确的补全,clangd 必须知道项目的完整编译过程。以下是具体步骤:
clangd 从 compile_commands.json 中提取与当前文件相关的编译命令(通过 file 字段匹配当前正在编辑的文件)。
它使用 command 字段中的编译选项来理解该文件是如何编译的,尤其是头文件搜索路径和宏定义。
通过 directory 字段,clangd 确保在正确的目录中解析相对路径的头文件。
利用这些信息,clangd 可以解析当前文件和其依赖的头文件,分析代码结构。
当用户请求代码补全时,clangd 根据已有的符号表和代码上下文生成可能的补全建议。 -
错误诊断和静态分析
通过 compile_commands.json 提供的信息,clangd 也可以对代码进行更精确的错误诊断。例如,某些编译选项(如宏定义、头文件搜索路径)可能会影响到编译器能否正确处理某段代码。clangd 使用这些选项来确保它分析代码时的环境与实际编译环境一致,这样可以帮助开发者更早地发现编译错误或潜在问题。
三、静态库和动态库
3.1 静态库(Static Library)
扩展名:静态库在 Linux 和 macOS 中通常是 .a 文件,在 Windows 中是 .lib 文件。
编译时链接:静态库在编译阶段被直接链接到可执行文件中。在生成可执行文件时,静态库的代码被完整地拷贝到最终的可执行文件中。
-
优点:
独立性:静态链接的可执行文件不依赖于外部的库文件,在运行时不需要额外的库文件。
运行效率:静态库在运行时无需动态加载,运行速度更快,因为所有库代码都已经编译进可执行文件中。 -
缺点:
文件体积大:由于库的代码被拷贝到可执行文件中,生成的可执行文件通常比动态链接方式大。
更新不便:如果静态库有更新,所有依赖该库的可执行文件都需要重新编译。
CMake 中创建静态库: 使用 add_library() 命令,并将 STATIC 作为参数:
add_library(my_static_lib STATIC lib_source1.cpp lib_source2.cpp)
这会生成一个静态库 my_static_lib.a(在 Linux/macOS)或 my_static_lib.lib(在 Windows)。
3.2 动态库(Shared Library 或 Dynamic Library)
扩展名:动态库在 Linux 中是 .so 文件,在 macOS 中是 .dylib 文件,在 Windows 中是 .dll 文件。
运行时链接:动态库在运行时才被加载到内存中。可执行文件只包含对动态库的引用,而不直接包含库的代码。在可执行文件运行时,操作系统会加载动态库,并链接到可执行文件中。
-
优点:
节省空间:由于多个可执行文件可以共享一个动态库,生成的可执行文件较小,而且系统内存中也只需加载一次动态库。
更新方便:动态库更新时,不需要重新编译可执行文件。只需替换动态库即可使所有依赖的可执行文件使用新版库。 -
缺点:
运行时依赖:可执行文件在运行时依赖于动态库,因此动态库必须存在于系统的库路径中。如果动态库缺失或版本不兼容,可执行文件将无法运行。
加载开销:在运行时加载和链接动态库可能会引入一定的性能开销。
CMake 中创建动态库: 使用 add_library() 命令,并将 SHARED 作为参数:
add_library(my_shared_lib SHARED lib_source1.cpp lib_source2.cpp)
这会生成一个动态库 my_shared_lib.so(在 Linux)或 my_shared_lib.dll(在 Windows)。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
相关文章:
CMake学习
向大佬lyf学习,先把其8服务器中所授fine 文章目录 前言一、CMakeList.txt 命令1. 最外层CMakeLists1.1 cmake_minimum_required()1.2 project()1.3 set()1.4 add_subdirectory(&…...

书生·浦语大模型全链路开源开放体系
书生浦语大模型全链路开源开放体系 大模型应用生态的发展和繁荣是建立在模型基座强大的通用基础能力之上的。上海AI实验室联合团队研究认为,大模型各项性能提升的基础在于语言建模能力的增强,对于大模型的研究应回归语言建模本质,通过更高质量…...
PHP安装swoole扩展无效,如何将文件上传至Docker容器
目录 过程 操作方式 过程 在没有使用过云服务器以前,Docker这个平台一直都很神秘。在我申请了华为云服务器,并使用WordPress镜像去搭建自己的网站以后,我不得不去把Docker平台弄清楚,原因是我使用的一个主题需要安装swoole扩展,才能够正常启用。而要将swoole.so这个扩展…...
Web3.0 应用项目
Web3.0 是下一代互联网的概念,旨在去中心化、用户拥有数据控制权和通过区块链技术实现信任的网络。Web3.0的应用项目主要集中在区块链、加密货币、去中心化应用 (DApps)、去中心化金融 (DeFi)、NFT(非同质化代币)等领域。以下是一些典型的 We…...
Linux 学习笔记(十六)—— 重定向与缓冲区
一、文件重定向 矩阵的下标,也就是文件描述符的分配规则,是从0开始空的最小的文件描述符分配给进程新打开的文件;文件输出重定向的原理是,关掉1(输出),然后打开文件,这个新打开的文…...

828华为云征文|WordPress部署
目录 前言 一、环境准备 二、远程连接 三、WordPress简介 四、WordPress安装 1. 基础环境安装 编辑 2. WordPress下载与解压 3. 创建站点 4. 数据库配置 总结 前言 WordPress 是一个非常流行的开源内容管理系统(Content Management System, CMS…...

华为开源自研AI框架昇思MindSpore应用案例:计算高效的卷积模型ShuffleNet
如果你对MindSpore感兴趣,可以关注昇思MindSpore社区 ShuffleNet ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型,和MobileNet, SqueezeNet等一样主要应用在移动端,所以模型的设计目标就是利用有限的计算资源来达到…...
《C++ 小游戏:简易飞机大战游戏的实现》
文章目录 《C 游戏代码解析:简易飞机大战游戏的实现》一、游戏整体结构与功能概述二、各个类和函数的功能分析(一)BK类 - 背景类(二)hero_plane类 - 玩家飞机类(三)plane_bullet类 - 玩家飞机发…...

SpringCloud源码:服务端分析(二)- EurekaServer分析
背景 从昨日的两篇文章:SpringCloud源码:客户端分析(一)- SpringBootApplication注解类加载流程、SpringCloud源码:客户端分析(二)- 客户端源码分析。 我们理解了客户端的初始化,其实…...

插槽slot在vue中的使用
介绍 在 Vue.js 中,插槽(slot)是一种用于实现组件内容分发的功能。通过插槽,可以让父组件在使用子组件时自定义子组件内部的内容。插槽提供了一种灵活的方式来组合和复用组件。 项目中有很多地方需要调用一个组件,比…...

针对考研的C语言学习(定制化快速掌握重点2)
1.C语言中字符与字符串的比较方法 在C语言中,单字符可以用进行比较也可以用 > , < ,但是字符串却不能用直接比较,需要用strcmp函数。 strcmp 函数的原型定义在 <string.h> 头文件中,其定义如下: int strcmp(const …...
[C++][IO流][流输入输出][截断理解]详细讲解
目录 1.流输入输出说明1.<<执行顺序2.>>执行顺序 2.截断(trunc)理解 1.流输入输出说明 1.<<执行顺序 链式操作的顺序:当使用多个<<操作符进行链式插入时,执行顺序是从左到右的 每个<<操作都将数据插入到前一个流的输出中…...

阿里云部署1Panel(失败版)
官网脚本部署不成功 这个不怪1panel,这个是阿里Linux 拉不到docker的下载源,懒得思考 正常部署直接打开官网 https://1panel.cn/docs/installation/online_installation/ 但是我使用的阿里云os(Alibaba Cloud Linux 3.2104 LTS 64位) 我执行不管用啊装不上docker 很烦 curl -s…...

九、设备的分配与回收
1.设备分配时应考虑的因素 ①设备的固有属性 设备的固有属性可分为三种:独占设备、共享设备、虚拟设备。 独占设备 一个时段只能分配给一个进程(如打印机) 共享设备 可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享使用设备而微观上交替使用。 …...
单片机的原理及应用
单片机的原理及应用 1. 单片机的基本原理 1.1. 组成部分 单片机主要由以下几个部分组成: 中央处理器(CPU):执行指令并控制整个系统的操作。 存储器: 程序存储器(Flash):存储用户…...

Python数据分析篇--NumPy--入门
我什么也没忘,但是有些事只适合收藏。不能说,也不能想,却又不能忘。 -- 史铁生 《我与地坛》 NumPy相关知识 1. NumPy,全称是 Numerical Python,它是目前 Python 数值计算中最重要的基础模块。 2. NumPy 是针对多…...

OJ在线评测系统 后端 判题机模块预开发 架构分析 使用工厂模式搭建
判题机模块预开发(架构师)(工厂模式) 判题机模块 是为了把代码交个代码沙箱去处理 得到结果返回 代码沙箱 梳理判题模块和代码沙箱的关系 判题模块:调用代码沙箱 把代码和输入交给代码沙箱去执行 代码沙箱:只负责接受代码和输入 返回编译的结果 不负…...
linux 目录文件夹操作
目录 查看文件夹大小: Linux统计文件个数 2.统计文件夹中文件个数ls -l ./|grep "^-"|wc -l 4.统计文件夹下文件个数,包括子文件ls -lR | grep "^-"| wc -l 统计文件个数 移动绝对目录: 移动相对目录 test.py报错…...

(Linux驱动学习 - 4).Linux 下 DHT11 温湿度传感器驱动编写
DHT11的通信协议是单总线协议,可以用之前学习的pinctl和gpio子系统完成某IO引脚上数据的读与写。 一.在设备树下添加dht11的设备结点 1.流程图 2.设备树代码 (1).在设备树的 iomuxc结点下添加 pinctl_dht11 (2).在根…...

前端登录页面验证码
首先,在el-form-item里有两个div,各占一半,左边填验证码,右边生成验证码 <el-form-item prop"code"><div style"display: flex " prop"code"><el-input placeholder"请输入验证…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...