VSCode Cpp 配置
记录一下目前在VSCode配置C++的内容。 需要说明的是,本文中的配置方案不适合小白,配置比较复杂: 使用 clangd 替换了微软官方的 Cpp 插件 深度结合 CMake 使用 不依赖 VSCode 的 tasks.json 支持多种编译环境 一种更简单的配置方案是基于 Code Runner 插件和 tasks.json 实现的,但是缺点是无法应用于复杂项目中,只适合单个源文件的简单情况,比如 C++ 的简单练习。 必要软件为了正常使用所有功能,除了针对VSCode的配置,需要单独安装下列软件,并把路径添加到PATH Git CMake ninja 插件列表首先列一下目前在VSCode上使用的,涉及到C++的核心插件: C/C++ (Microsoft):微软官方默认的C/C++插件,禁用了代码提示,但是调试这些还需要用它,不能完全禁用 clangd (LLVM):LLVM官方提供的,当前代码提示的主力插件 CMake Tools (Microsoft):微软官方提供的CMake支持,提供CMake命令工具条和快捷指令,以及CMake语法高亮...
Cpp 编译环境笔记
整理一下关于C++编译器的笔记。 在本文中只关注x64平台,Windows(10/11)或 Linux(限于Ubuntu)系统的C/C++编译环境,并且不考虑交叉编译等问题。除了系统原生的MSVC和GCC,重点关注两个概念: MinGW,MinGW-W64,MSYS… LLVM,clang 将这两组概念并列是不合适的,因为它们根本不是一个层面上的东西,但是这两个确实是我在理解C++编译环境配置时遇到的最大困难。 基本概念C 语言标准c 语言的标准分成两部分: 语法,指导我们应该怎么编程,在源文件中必须满足某些规则 标准库(头文件),相对于系统层面向 c 语言程序提供的一些基础接口,例如printf等,但语法标准只是规定了接口的形式,并没有具体的实现 对 c 语言的支持,也分成两个部分: c 编译器,从源代码得到可执行文件和库文件 c 标准库的具体实现,以库文件的形式提供最基础的功能(以及对应的头文件),供其他程序使用 glibc由于Liunx系统和Windows系统都是基于c/c++编写的,在系统中实际提供的不仅仅是c标准库的实现,还包括...
Cpp 日志库 spdlog 配置与使用
整理一下关于C++项目中日志库的学习,在之前曾经陆续实现过几次较为简单的日志工具,但是在编程逐步正式化之后,自己造这种基础的轮子还是没必要的,采用成熟的spdlog日志库比较合适。 概述spdlog是一个快速的、跨平台的C++日志库,它提供了简单易用的API,支持多种日志级别、多线程安全、异步日志写入等功能。它具有灵活的配置选项,允许开发者根据需要自定义日志记录行为,支持日志文件的轮换和分割等常见功能。因为spdlog的使用简单直观,文档齐全,社区活跃,它已经成为当前最常用的C++日志记录工具之一。 spdlog对使用者非常友好: 可以作为纯头文件库使用,直接复制到项目中 可以在编译安装后通过CMake导入 可以将源码直接放在项目文件夹下,作为CMake子项目添加并使用(作为头文件库或二进制库均可) spdlog更推荐通过编译使用,因为可以节约整体的编译时间,否则每次编译时spdlog也要占用相当的时间,可能是用了大量模板的原因。在导入spdlog的头文件时,采用按需取用的策略,而不是某些库采用的只需要include一个万能头文件即可。 spdlog依赖fmtlib进行格...
Github workflow 学习笔记
学习一下 Github 仓库的工作流语法,希望在 Github 仓库中自动执行测试。重点关注两类项目所需要的基本测试工作流,分别是跨平台 CMake 项目和 LaTeX 项目。 概述Github 仓库提供工作流来自动化执行应用的部署,测试和发布等流程。工作流的实质是在 Github 服务器上提供了几个临时的虚拟环境(Docker),让用户在提交或其他 Git 行为后触发工作流,然后在虚拟机环境中自动执行相关的指令。 例如,可以使用一个工作流来构建和测试拉取请求,使用另一个工作流在每次创建版本时部署应用程序,还有另一个工作流程在每次有人打开新问题时添加标签。 注意: Github 仓库支持多个工作流,它们可以同时触发或分别触发。 Github 对公开仓库提供的这类服务是无限制的,但是对私有仓库是受限的,每个月提供免费的时间额度和存储额度,超额需要付费。 如果在仓库中触发的一个工作流运行失败了,Github 可能通过邮件通知。 一个典型的工作流(workflow)包含: 触发工作流的一个或多个事件 一个或多个作业(job),每个作业都将在运行器机器上执行并运行一系列的一个或多个...
Cpp 单元测试:GoogleTest + CTest 配置与使用
现在我们关注CMake项目中的测试部分,具体包括GoogleTest和CTest的使用。 概述Google Test(简称为 gtest)是 Google 开发的一个开源的 C++ 测试框架,用于编写和运行单元测试、集成测试和功能测试。主要特点包括: 支持各种平台和编译器,包括 Linux、Windows 和 macOS,并且与主流的 C++ 编译器兼容。 提供了丰富的断言宏,如 EXPECT_EQ、ASSERT_TRUE 等,用于验证代码行为是否符合预期。 支持参数化测试,允许以不同的参数运行同一个测试用例。 可以生成详细的测试报告,包括测试通过的数量、失败的数量、失败的原因等信息。 可以扩展测试框架,编写自定义的测试扩展和断言宏。 除了 Google Test,Catch2 也是一个相对主流的 C++ 测试框架,Catch2 还是一个 header-only 的单文件库。 通常无法对可执行文件进行单元测试,如果需要测试的目标可执行文件,一个建议的做法是把核心逻辑全部写成一个静态库文件,可执行文件仅仅作为库文件的简单包装,然后对库进行测试。(例如 CPython 作为...
CUDA学习笔记——入门例子
虽然配置CUDA的目的主要是支持PyTorch的机器学习,但是如果需要直接手写CUDA代码,并在Windows上使用nvcc顺利编译和执行纯CUDA程序,还需要Visual Studio相关工具的支持。(MINGW似乎不太行,或者说鼓捣起来太麻烦,Windows中的nvcc默认是配合MSVC进行编译的)鉴于我在电脑上安装了VS2022,并且CUDA自动给VS2022加了插件适配,因此尝试学一点CUDA,并写几个简单的HelloWorld程序。 基本概念CUDA编程模型是一个异构模型,需要CPU和GPU协同工作,通常CPU负责处理逻辑复杂的串行程序,而GPU重点处理数据密集型的并行计算程序,从而发挥最大功效。在CUDA中,用host指代CPU及其内存,用device指代GPU及显存。CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。host与device之间可以进行通信,在它们之间通信需要进行数据拷贝。一个典型的CUDA程序的计算流程如下: 分配host内存,并进行数据初始化; 分配device显存,并从host将数据拷贝到device上;...
CUDA学习笔记——基本概念与CUDA下载
显卡显卡(Graphics card),全称显示接口卡,又称显示适配器,是计算机的重要硬件组件之一,负责图形处理和显示输出。显卡通常由 GPU(图形处理器)、显存、供电模块等部分组成。类似的扩展设备还有网卡、声卡等。显卡的主要功能是将计算机内部处理的数字信号转换为显示器可识别的图像信号,从而驱动屏幕显示内容。 早期显卡多集成在主板上,仅承担基础的视频输出功能,并不负责复杂的图形计算。随着技术发展,出现了独立显卡和集成显卡的区分: 集成显卡:集成在 CPU 或主板芯片组中,依赖系统内存(RAM)作为显存,无法单独更换。适用于轻量办公和日常使用。 独立显卡:作为独立硬件插入主板的 PCIe 插槽,拥有专用显存和更强的计算能力,可随时更换升级。独立显卡在图形渲染、视频处理、科学计算等任务中表现更优。 现代笔记本通常配备双显卡:一个集成显卡(低功耗)和一个独立显卡(高性能)。系统可根据任务需求自动切换,以平衡性能和能耗。轻薄本可能仅配集成显卡以延长续航,而游戏本、工作站则倾向于搭载性能优先的独立显卡。 显卡驱动显卡作为硬件设备,需要在操作系统中安装正确的显卡驱动程序以正常运行。**显...
LaTeX Beamer 笔记
系统地整理一下 Beamer 的笔记,之前的使用只是基于某个模板的临时使用,当前的目标是整理一个简洁的自用 Beamer 模板。注意到 Beamer 虽然属于LaTeX的一部分,但是与标准的 LaTeX 文档有很多的不同,部分 LaTeX 宏包和命令可能无法在 Beamer 上呈现正常的效果,这也意味着 Beamer 的编译错误更难改正。 笔记主要参考 latex-beamer.com 的英文在线教程和若干博客。 当前模板的两种风格效果如下图,模板存放在Github仓库:latexzero。 极简示例从一个最简单的例子开始 1234567891011121314151617181920212223\documentclass{beamer}% Theme choice:\usetheme{AnnArbor}% Title page details:\title{My First \LaTeX{} Presentation}\subtitle{A subtitle}\auth...
VSCode LaTeX WorkShop 配置
基础概念LaTeX WorkShop 插件的编译逻辑分为两层:第一层为recipe,第二层为tool,具有如下特点: 一个recipe由若干个tool组成; 在配置文件中可以提供多个recipe和多个tool; 直接点击编译按钮会自动选择第一个(或上一次使用的)recipe来执行编译; 一个tool通常包括一个单独的编译命令加上若干参数,例如xelatex,lualatex和pdflatex等,还可能是处理参考文献需要的bibtex或biber; 一个recipe会依次执行它所包含的tool,例如: 1xelatex -> bibtex -> xelatex -> xelatex LaTeX WorkShop 插件其实只是对原本在命令行操作的 LaTeX 编译命令以及格式化命令进行了封装。此外,LaTeX WorkShop 插件会在命令中传递特殊变量%DOC%或%DOCFILE%代表当前文件,第一个是文件名(含完整路径,不含后缀),第二个则是文件名(不含后缀),略有区别。 由于插件也只是调用了pdflatex、latexmk等编译命令,如果环境中存在.l...
LaTeX 参考文献笔记
整理一下LaTeX中关于参考文献的内容。 基本命令和引用LaTeX提供的对参考文献的底层支持主要是thebibliography环境,大致相当于一个特殊的列表,在使用的地方会展示参考文献列表(包括标题 References 或 参考文献),使用示例如下 12345678910111213\documentclass{article}\begin{document}According to Einstein's theory of relativity \cite{einstein1905}...\begin{thebibliography}{99} \bibitem{einstein1905} Albert Einstein. \textit{On the Electrodynamics of Moving Bodies}. Annalen der Physik, 1905. \bibitem{knuth198...
