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"请输入验证…...
【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)
系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上) 文…...
使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程
使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程 在这篇文章中,我们将介绍如何使用 Nginx 和 Gunicorn 来部署一个 Flask 项目。这种部署方式非常适合在生产环境中使用,因为它能够提供更好的性能和更高的稳定性。 目录 Flask 项目简介环境准备Gunico…...
linux中bashrc和profile环境变量在Shell编程变量的传递作用
在 Linux 系统中,.bashrc文件和.profile文件都是用于配置用户环境的重要文件,它们之间有以下关联: 一、作用相似性 环境设置:两者都用于设置用户的环境变量和启动应用程序的配置。例如,它们可以定义路径变量…...
数据结构-4.2.串的定义和基本操作
一.串的定义: 1.单/双引号不是字符串里的内容,他只是一个边界符,用来表示字符串的头和尾; 2.空串也是字符串的子串,空串长度为0; 3.字符的编号是从1开始,不是0; 4.空格也是字符&a…...
fastzdp_redis第一次开发, 2024年9月26日, Python操作Redis零基础快速入门
提供完整录播课 安装 pip install fastzdp_redisPython连接Redis import redis# 建立链接 r redis.Redis(hostlocalhost, port6379, db0)# 设置key r.set(foo, bar)# 获取key的值 print(r.get(foo))RESP3 支持 简单的理解: 支持更丰富的数据类型 参考文档: https://blog.c…...
文件名:\\?\C:\Windows\system32\inetsrv\config\applicationHost.config错误:无法写入配置文件
文件名: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 错误:无法写入配置文件 解决办法: 到C:\inetpub\history中找到最近一次的【CFGHISTORY_00000000XX】文件,点击进去找到applicationHost.config文件,用其覆盖C:\Win…...
Optiver股票大赛Top2开源!
Optiver股票大赛Top2开源! ↑↑↑关注后"星标"kaggle竞赛宝典 作者:杰少 Optiver第二名方案解读 简介 Optiver竞赛已经于今天结束了,竞赛也出现了极端情况,中间断崖式的情况,在Kaggle过往的竞赛中&#…...
Maven 实现依赖统一管理
Maven 实现依赖统一管理主要是通过两个关键机制:pom.xml 文件中的 <dependencies> 节点用于声明项目依赖,以及通过继承(Inheritance)和聚合(Aggregation)功能来统一管理和组织这些依赖。此外…...
【最新】微信小程序连接onenet——stm32+esp8266+onenet实现查看温湿度,控制单片机
微信小程序——stm32esp8266onenet实现查看温湿度,控制单片机 (最新已验证)stm32 新版 onenet dht11esp8266/01s mqtt物联网上报温湿度和控制单片机(保姆级教程) :↓↓👇 👇 👇 👇…...
差分(续前缀和)(含一维二维)
题目引入 开发商小 Q 买下了一条街,他想在这条街的一边盖房子。 街道可以抽象为一条数轴,而小 Q 只会在坐标在 1~n 的范围内盖房子。 首先,小 Q 将街上坐标在 1∼ 𝑛1∼ n 范围内的物体全部铲平。也就是说,在正式动工盖…...
图文制作/seo网站推广方案策划书
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid3487 题目思路:splay,区间旋转和区间转移,区间转移的时候要注意向上更新,旋转的时候要注意rev要异或。 #include<stdio.h> #include<stdlib.h> #include<st…...
自助建站空间怎么用/品牌推广策略有哪几种
Linux解决rm 删除大文件后 磁盘空间无法释放的问题在Linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间,最后造成磁…...
杭州网站建设代理商/今日军事新闻头条
pip更新及Requirement already up-to-date解决方法参考文章: (1)pip更新及Requirement already up-to-date解决方法 (2)https://www.cnblogs.com/tielemao/p/9628754.html 备忘一下。...
wordpress模板dux/google推广公司哪家好
第三章 进程描述和控制 一、什么是进程: 开发操作系统是为了给应用程序提供一个方便、安全和一致的接口。 操作系统是计算机硬件和应用程序之间的一层软件,对应用程序和工具提供支持。 目标: 资源对多个应用程序是可用的; 物理处…...
外贸自建站如何收款/网站优化要做哪些
保存照片和视频到系统相册显示- http://blog.csdn.net/chendong_/article/details/52290329 Android 7.0 之拍照与图片裁剪适配-http://blog.csdn.net/yyh352091626/article/details/54908624 拍照、相册及裁剪的终极实现(一)——拍照及裁剪功能实现- ht…...
给个网站免费的/永久免费无代码开发平台网站
我们知道RabbitMQ可以配置成Queue做主从复制(按照官方的说法叫配置mirror queue),对master queue的写操作会被复制到其他slave上去(也就是复制到mirror queue上去)。这对rabbitmq的这个特性,有些人会问这样…...