关于

个人学习相关资料整理笔记,持续更新中。。。

docker

  • 1. Docker简介

    什么是容器?

    容器是一种轻量级、可移植、自给自足的软件运行环境,能够封装应用及其所有依赖(如库、配置文件等),确保应用在任何环境中都能一致运行。与虚拟机相比,容器不需要虚拟化硬件,而是利用操作系统的功能来实现隔离。

    容器与虚拟机的区别

    • 资源隔离方式:虚拟机(VM)通过虚拟化技术隔离整个操作系统,而容器则共享宿主操作系统内核,隔离的是用户空间。
    • 性能:由于容器不需要启动完整的操作系统,它们的启动速度更快,资源占用更少。
    • 资源使用:容器比虚拟机使用的系统资源更少,适合高密度部署。

    Docker的架构和组件

    • Docker Daemon:也叫Docker Engine,是容器的核心,负责管理容器的生命周期,包括容器的创建、运行、停止和删除等。
    • Docker Client:是与Docker Daemon进行交互的命令行客户端,用户通过Docker命令与其交互。
    • Docker Registry:是镜像仓库,存储Docker镜像。Docker Hub是公共的Docker Registry,用户也可以配置私有的镜像仓库。

    Docker的优点

    • 可移植性:Docker容器能够保证应用在任何环境下都能一致运行,无论是在本地开发环境、测试环境,还是生产环境。
    • 资源隔离:容器提供了进程、网络、文件系统的隔离,确保容器内的应用互不干扰。
    • 快速部署:容器的启动非常快速,且可以在几秒钟内创建多个实例,实现高效的应用部署和扩展。

    2. 安装与配置

    在不同操作系统上安装Docker

    • Linux:通过包管理工具(如aptyum)安装,或者直接从Docker官方网站下载并安装。
    • macOS:可以通过Docker Desktop进行安装,安装后会自带Docker Daemon和Client。
    • Windows:类似macOS,通过Docker Desktop进行安装,也支持Windows容器。

    Docker命令行基础

    • docker run:创建并启动一个新的容器。
    • docker ps:列出当前运行中的容器。
    • docker stop:停止一个正在运行的容器。
    • docker exec:在容器中执行命令。

    Docker配置与镜像下载源

    • 配置国内镜像源(如阿里云)可以加速镜像的下载。可以通过修改/etc/docker/daemon.json文件来配置镜像源。

    3. Docker镜像

    什么是镜像,如何使用和构建镜像

    Docker镜像是容器的模板,包含了应用和运行所需的所有环境。通过使用docker build命令可以根据Dockerfile构建镜像。

    官方镜像与自定义镜像

    • 官方镜像:Docker Hub上由Docker团队和开源社区维护的镜像。
    • 自定义镜像:用户根据自己的需求,在Dockerfile中定义构建镜像的步骤和依赖,创建个性化的镜像。

    Dockerfile基础

    Dockerfile是用于构建镜像的脚本,定义了镜像的构建过程。常见指令包括:

    • FROM:指定基础镜像。
    • RUN:在镜像内执行命令。
    • COPY:复制文件到镜像中。
    • EXPOSE:声明容器监听的端口。

    镜像的版本控制

    Docker镜像使用标签(tag)进行版本控制,常见格式是image:tag,如ubuntu:20.04,其中ubuntu是镜像名称,20.04是版本标签。

    4. Docker容器

    容器的创建与管理

    • docker run:创建并启动一个新容器。
    • docker start:启动一个已停止的容器。
    • docker stop:停止一个正在运行的容器。
    • docker rm:删除一个停止的容器。

    容器与镜像的关系

    容器是从镜像创建出来的实例,镜像是容器的静态模板,而容器则是动态的、可运行的。

    容器的数据卷与持久化

    • Volumes:Docker管理的卷,适用于持久化存储。
    • Bind Mounts:将主机的文件系统挂载到容器中,用于在容器中访问主机的文件或目录。

    网络管理

    • Bridge Network:容器在同一主机上通过虚拟桥接进行通信。
    • Host Network:容器共享宿主机的网络栈,适用于对网络性能要求较高的场景。
    • Overlay Network:跨多主机的容器网络,适用于Swarm模式下的容器通信。

    5. Docker Compose

    什么是Docker Compose,如何安装与使用

    Docker Compose是一个工具,用于定义和运行多容器Docker应用。通过编写docker-compose.yml文件,用户可以一键启动多个服务。

    编写docker-compose.yml文件

    该文件用于定义多个服务的配置,如镜像、容器名称、端口映射等。

    使用Docker Compose管理多容器应用

    通过docker-compose up命令启动所有定义的服务,docker-compose down停止并移除所有容器。

    管理不同环境的配置

    可以在docker-compose.yml文件中使用不同的配置文件来管理开发、测试和生产环境中的不同配置。

    6. Docker网络与存储

    Docker的网络模式

    • Bridge:默认的网络模式,适用于容器与容器之间在同一主机上的通信。
    • Host:容器共享主机的网络栈,适用于高性能网络需求。
    • None:容器不连接任何网络。
    • Overlay:跨多个Docker主机进行网络通信,适用于Swarm集群。
    • Macvlan:为容器分配独立的网络接口,适用于需要容器直接与外部网络通信的场景。

    数据卷与存储

    • 持久化存储:使用Volumes进行数据持久化,保证容器停止后数据不丢失。
    • 临时存储:在容器生命周期内的数据存储。

    使用docker volume管理数据卷

    使用docker volume create创建卷,docker volume ls列出卷,docker volume rm删除卷。

    7. Docker注册与私有仓库

    Docker Hub介绍与使用

    Docker Hub是Docker的公共镜像仓库,提供各种官方镜像和社区镜像。

    配置私有镜像仓库

    可以通过搭建私有Registry服务来管理自己的镜像,配置私有仓库时需要使用认证和授权机制。

    推送与拉取镜像操作

    • docker push:将镜像上传到远程仓库。
    • docker pull:从远程仓库拉取镜像。

    镜像的安全性与版本管理

    确保镜像的安全性,通过扫描镜像、使用官方镜像、定期更新镜像版本来管理镜像的安全和版本控制。

    8. Docker的安全性与最佳实践

    Docker容器的安全性问题与防护

    • 容器逃逸:容器内的进程可能通过漏洞突破隔离,影响宿主机或其他容器。
    • 配置错误:容器配置不当可能导致安全漏洞,如过度暴露端口、使用高权限用户运行容器等。

    使用非特权用户运行容器

    应尽量避免使用root用户运行容器,改为使用非特权用户来减少潜在的安全风险。

    镜像的最小化与扫描

    • 使用尽量精简的基础镜像,如alpine,以减少潜在的漏洞。
    • 定期扫描镜像中的安全漏洞,使用工具如Docker Bench for Security或Clair进行安全检查。

docker-compose.yaml示例:

version: '3.8'  # 指定docker-compose的版本

services:  # 定义服务部分
  web:  # 服务名称,通常是应用的名称
    image: nginx:latest  # 使用的Docker镜像,可以是官方镜像或自定义镜像
    container_name: my-web-container  # 容器名称
    ports:  # 端口映射,将主机的端口映射到容器的端口
      - "8080:80"  # 将主机的8080端口映射到容器的80端口
    networks:  # 定义服务所使用的网络
      - web-network  # 将此服务连接到web-network网络
    volumes:  # 挂载卷,将宿主机的目录与容器内的目录同步
      - ./html:/usr/share/nginx/html  # 将当前目录下的html文件夹挂载到容器的指定目录

  db:  # 另一个服务,数据库服务
    image: mysql:5.7  # 使用MySQL的镜像,指定版本5.7
    container_name: my-db-container  # 容器名称
    environment:  # 配置环境变量,传递给容器
      MYSQL_ROOT_PASSWORD: example  # 设置MySQL的root用户密码
    volumes:  # 数据卷挂载
      - db-data:/var/lib/mysql  # 将数据库数据保存在一个独立的卷中,确保数据持久化
    networks:  # 服务的网络配置
      - web-network  # 与web服务共享网络

networks:  # 定义网络部分
  web-network:  # 自定义的网络名称
    driver: bridge  # 使用桥接网络模式

volumes:  # 定义数据卷部分
  db-data:  # 持久化MySQL数据库的数据

k8s

1. Kubernetes概述

什么是Kubernetes,容器编排的必要性

Kubernetes(K8s)是一个开源的容器编排平台,旨在自动化部署、扩展和管理容器化应用。容器编排的必要性体现在:

  • 容器化应用管理的复杂性:随着容器的广泛应用,如何高效地管理成千上万个容器成为了一个挑战。Kubernetes解决了容器的生命周期管理、服务发现、负载均衡等问题。
  • 高可用性和弹性扩展:容器编排工具(如Kubernetes)提供自动扩容、故障恢复和负载均衡等能力,保证应用在集群中始终可用。

Kubernetes的架构(Master Node, Worker Node)

  • Master Node:负责管理集群的状态和控制,处理调度、监控、集群健康检查等工作。它包括以下组件:
    • API Server:处理外部请求并进行认证授权。
    • Controller Manager:负责控制器管理,确保集群状态符合期望。
    • Scheduler:决定将容器调度到哪个Node上。
    • etcd:集群的分布式数据库,存储集群的所有配置和状态数据。
  • Worker Node:也叫Node,是实际运行容器的节点。每个Node都包含以下组件:
    • Kubelet:负责管理Node上的Pod生命周期,确保Pod的容器按预期运行。
    • Kube Proxy:负责处理Pod间的网络通信。
    • Container Runtime:运行容器的实际运行时(如Docker、containerd等)。

Kubernetes的主要组件:Pod, ReplicaSet, Deployment, Service, Namespace等

  • Pod:Kubernetes中最小的部署单元,一个Pod可以包含一个或多个容器,它们共享存储和网络资源。
  • ReplicaSet:保证Pod的副本数量与期望一致,提供Pod的高可用性。
  • Deployment:用于管理Pod的部署与版本控制,支持自动化的滚动更新和回滚。
  • Service:提供稳定的网络地址,暴露Pod的访问入口,支持负载均衡。
  • Namespace:用于多租户环境中资源的隔离,每个Namespace可以包含不同的资源,如Pod、Service等。

Kubernetes与Docker的关系

  • Docker提供了容器化的解决方案,而Kubernetes负责管理容器的部署、扩展和监控。
  • Docker是容器运行时(Container Runtime),而Kubernetes是容器编排工具,两者互相补充。Kubernetes可以使用Docker作为其容器运行时,然而Kubernetes也支持其他容器运行时(如containerd、CRI-O等)。

2. Kubernetes安装与配置

部署Kubernetes集群

  • Minikube:适用于开发和学习环境,提供单节点的Kubernetes集群。
  • kubeadm:用于在物理或虚拟机上手动部署Kubernetes集群,适合生产环境。
  • Kind:在Docker容器中运行Kubernetes集群,适用于本地开发和测试。
  • K3s:轻量级的Kubernetes发行版,适用于资源有限的环境。

配置kubectl工具

kubectl是与Kubernetes集群交互的命令行工具。通过配置~/.kube/config文件,用户可以指定Kubernetes API Server的位置、认证方式等信息。

使用Kubernetes Dashboard

Kubernetes Dashboard是一个基于Web的UI,允许用户管理和监控Kubernetes集群及其资源。它提供了对Pods、Services、Deployments等资源的图形化管理界面。

常见的安装与配置问题及解决

  • kubectl连接问题:确保kubeconfig文件配置正确,并且API Server可访问。
  • 集群网络问题:检查CNI插件是否正确安装,以及各节点之间的网络连接是否正常。

3. Kubernetes核心概念与资源管理

Pod:Pod的概念,Pod内的容器管理

Pod是Kubernetes中的基本部署单元,它封装了一个或多个容器,容器共享存储、网络和其他资源。Pod内的容器通常是紧密相关的、需要共享资源的。

ReplicaSet:Pod的副本控制

ReplicaSet确保某个Pod的副本数量与期望数量一致。它监控Pod的健康状态,并在Pod失败时自动创建新的副本以维持期望数量。

Deployment:自动化管理应用的部署与扩展

Deployment是一种用于声明式管理Pod和ReplicaSet的Kubernetes资源对象。它支持Pod的滚动更新、回滚操作以及Pod的扩缩容。

Service:暴露Pod的方式

  • ClusterIP:默认方式,Service只能在集群内访问。
  • NodePort:允许集群外部通过指定端口访问Service。
  • LoadBalancer:为Service创建一个外部负载均衡器,适用于云环境。
  • Ingress:管理HTTP和HTTPS路由,允许外部流量访问集群内的服务。

Namespace:多租户的资源隔离

Namespace为Kubernetes集群提供逻辑上的分隔,支持资源的多租户隔离。通过Namespace,可以隔离开发、测试、生产环境中的资源。

ConfigMap与Secret:配置管理与敏感信息存储

  • ConfigMap:用于存储非敏感的配置信息,Pod可以通过环境变量或挂载文件的方式使用ConfigMap中的数据。
  • Secret:用于存储敏感数据(如密码、API密钥等),可以加密存储和传输。

4. Kubernetes工作负载与调度

Deployment:创建、更新和回滚应用

Deployment用于定义应用的期望状态,支持滚动更新和回滚到先前的版本,确保高可用性。

StatefulSet:管理有状态应用

StatefulSet用于管理有状态应用(如数据库),它提供稳定的网络标识、持久化存储和顺序部署能力。

DaemonSet:为每个节点运行一个Pod

DaemonSet确保集群中的每个节点都运行一个Pod,适用于需要在每个节点上运行的服务,如日志收集器和监控代理。

Job和CronJob:批处理和定时任务

  • Job:用于运行一次性任务,确保任务成功完成。
  • CronJob:用于定期调度任务,类似于Linux中的Cron作业。

Pod调度与资源管理

Pod调度策略决定了Pod在哪个Node上运行,Kubernetes调度器基于资源需求、优先级、约束条件等进行调度。资源请求和限制(CPU、内存)帮助调度器合理分配集群资源。


5. Kubernetes网络与服务发现

Pod通信与网络模型

Kubernetes使用CNI(Container Network Interface)插件为集群中的Pod提供网络功能。Pod内的容器共享网络命名空间,因此它们可以通过localhost相互通信。

服务发现与负载均衡

Kubernetes的Service对象提供了Pod的稳定访问入口,Service通过负载均衡将流量分发到相应的Pod。Ingress控制器提供了更为复杂的HTTP路由功能。

Network Policies:定义Pod间的网络通信策略

Network Policies用于限制Pod间的通信,增强安全性。可以通过定义Ingress和Egress规则来控制哪些Pod或IP地址可以与Pod通信。

DNS与CoreDNS

CoreDNS是Kubernetes集群中的DNS服务器,它支持Service发现功能,可以通过域名访问集群中的Pod和Service。


6. 存储与持久化

Persistent Volume (PV) 与 Persistent Volume Claim (PVC)

  • Persistent Volume (PV):集群中的存储资源,由管理员预先创建。
  • Persistent Volume Claim (PVC):用户请求存储资源的方式,PVC与PV进行绑定,Pod通过PVC访问存储。

StorageClass:动态存储卷管理

StorageClass定义了存储卷的属性,如存储类型、访问模式等。可以实现动态创建存储卷。

StatefulSet与持久化存储

StatefulSet适用于需要持久化存储的有状态应用,它可以与PVC结合,确保每个Pod都拥有独立且持久的存储。

分布式存储与云存储

Kubernetes支持与各种分布式存储系统(如Ceph、GlusterFS)以及云存储(如EBS、NFS)集成,以满足存储需求。


7. Kubernetes的安全性

RBAC(Role-Based Access Control)

RBAC用于基于角色控制对Kubernetes资源的访问。通过定义Role和RoleBinding,限制用户和服务账户的权限。

Pod安全策略(PSP)

Pod安全策略(PSP)用于定义Pod的安全性要求,例如限制容器使用特权模式、运行用户等。

Kubernetes API的认证与授权

Kubernetes提供多种认证方式(如X.509证书、Bearer Token)和授权机制(如RBAC、ABAC)来保护API Server。

加密与Secret管理

Kubernetes通过加密存储敏感信息,并通过Secret管理存储密钥、密码等数据。Secret可与Pod挂载,也可以作为环境变量使用。

k8s yaml 示例

apiVersion: apps/v1  # 资源类型,指定API版本,这里是apps/v1表示Deployment属于这个版本
kind: Deployment  # 资源类型,Deployment是Kubernetes中的一种资源对象
metadata:
  name: nginx-deployment  # Deployment的名称
  labels:
    app: nginx  # 为Deployment附加一个标签
spec:
  replicas: 3  # 指定Pod副本数,Kubernetes会保持3个Nginx实例在集群中运行
  selector:
    matchLabels:
      app: nginx  # 用于选择应用的Pod,这里选择所有标签为app: nginx的Pod
  template:  # Pod的模板,用于创建Pod副本
    metadata:
      labels:
        app: nginx  # Pod的标签,与Deployment的selector中的matchLabels匹配
    spec:
      containers:
      - name: nginx  # 容器名称
        image: nginx:latest  # 使用nginx的官方镜像
        ports:
        - containerPort: 80  # 容器暴露的端口,Kubernetes将此端口映射到集群内部的服务

---
apiVersion: v1  # 资源类型,Service属于v1版本
kind: Service  # 资源类型,Service用于暴露Pod的网络访问
metadata:
  name: nginx-service  # Service的名称
spec:
  selector:
    app: nginx  # Service选择器,将流量路由到所有标签为app: nginx的Pod
  ports:
    - protocol: TCP  # 使用TCP协议
      port: 80  # 暴露Service的端口
      targetPort: 80  # 目标端口,指向容器的80端口
  type: LoadBalancer  # 将Service暴露为负载均衡器,可以使其被外部访问

C++

施工中。。。

项目设置

使用xmake创建项目并进行项目转换

# 创建 C++ 项目
xmake create -l c++ -P 项目名
# 项目转换信息设置
xmake f --toolchain=llvm --runtimes=c++_shared -cv  --vs=2022
# 转换为 vs 项目
xmake project -k vsxmake

# 使用 VisualStudio 或 Rider 打开项目开发即可

git 配置

# 设置 git init 时全局默认分支
git config --global init.defaultBranch dev
# 设置全局默认提交分支
git config --global push.default upstream dev

# 设置提交信息
git config user.name "you-name"
git config user.email "you-mail"

xmake常用命令

一、创建程序

示例:

xmake create -l c++ -P hello

参数说明:

  • create:创建一个新项目
  • -l c++:项目语言为c++
  • -P hello:更改到给定的项目目录,这里是hello

更多参数可以使用命令:xmake create --help 查看

使用创建模板程序

示例:

xmake create -l c++ -t console -P hello

参数说明:

  • -t console:使用控制台模版

创建静态库程序

使用模板创建

xmake create -l c++ -t static hello

创建动态库程序

使用模板创建

xmake create -l c++ -t shared  hello

二、运行程序

示例:

## 以 hello 程序为例

# 进入程序目录
cd hello

# 编译程序
xmake

# 运行程序,默认debug
xmake run

# release 编译
xmake f -m release

三、xmake.lua

xmake的工程描述文件xmake.lua虽然基于lua语法,但是为了使得更加方便简洁得编写项目构建逻辑,xmake对其进行了一层封装,使得编写xmake.lua不会像写makefile那样繁琐

基本上写个简单的工程构建描述,只需三行就能搞定,例如:

target("test")
    set_kind("binary")
    add_files("src/*.c")

更多配置语法参数:https://xmake.io/#/zh-cn/guide/syntax_description

四、包管理

4.1 xrepo

xrepo 是一个基于 Xmake 的跨平台 C/C++ 包管理器。

它基于 xmake 提供的运行时,但却是一个完整独立的包管理程序,相比 vcpkg/homebrew 此类包管理器,xrepo 能够同时提供更多平台和架构的 C/C++ 包。

并且还支持多版本语义选择,另外它还是一个去中心化的分布式仓库,不仅仅提供了官方的 xmake-repo 仓库,还支持用户自建多个私有仓库。

同时,xrepo 也支持从 vcpkg/homebrew/conan 等第三方包管理器中安装包,并提供统一一致的库链接信息,方便与第三方项目的集成对接。

如果你想要了解更多,请参考:在线文档, Github 以及 Gitee

4.2 使用 vcpkg 包

添加 vcpkg 的依赖包

add_requires("vcpkg::zlib", "vcpkg::pcre2")

target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_packages("vcpkg::zlib", "vcpkg::pcre2")

我们也可以加个包别名,简化对add_packages的使用:

add_requires("vcpkg::zlib", {alias = "zlib"})
add_requires("vcpkg::pcre2", {alias = "pcre2"})

target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_packages("zlib", "pcre2")

如果 vcpkg 包带有可选特性,我们也可以直接使用 vcpkg 的语法格式 packagename[feature1,feature2] 来安装包。

add_requires("vcpkg::boost[core]")

v2.6.3 之后,xmake 支持 vcpkg 新的清单模式,通过它,我们就能支持 vcpkg 包的版本选择,例如:

add_requires("vcpkg::zlib 1.2.11+10")
add_requires("vcpkg::fmt >=8.0.1", {configs = {baseline = "50fd3d9957195575849a49fa591e645f1d8e7156"}})
add_requires("vcpkg::libpng", {configs = {features = {"apng"}}})

target("test")
    set_kind("binary")
    add_files("src/*.cpp")
    add_packages("vcpkg::zlib", "vcpkg::fmt", "vcpkg::libpng")

v2.6.8 之后,还可以额外配置私有仓库,仅清单模式有效。

local registries = {
    {
        kind = "git",
        repository = "https://github.com/SakuraEngine/vcpkg-registry",
        baseline = "e0e1e83ec66e3c9b36066f79d133b01eb68049f7",
        packages = {
            "skrgamenetworkingsockets"
        }
    }
}
add_requires("vcpkg::skrgamenetworkingsockets >=1.4.0+1", {configs = {registries = registries}})

五、杂项

常用命令、技巧收集,默认都是程序目录执行。

命令作用
xmake project -k cmakelists将程序转换为cmake管理
xmake project -k vsxmake将程序转换为 Visual Studio 管理,使用 VS 做 IDE 有代码提示,调式方便( 推荐
chcp 65001CMD 临时设置UTF-8编码
chcp 936CMD 临时设置GBK编码

typora-copy-images-to: ./images

环境配置

Visual Studio Community

Visual Studio 可用于编辑、调试和生成代码,然后发布应用。除了大多数 IDE 都提供的标准编辑器和调试器之外,Visual Studio 还包括编译器、代码补全工具、图形设计器以及许多其他功能,以增强软件开发过程。

下载地址:https://visualstudio.microsoft.com/zh-hans/

需要选中以下组件,然后一键盘安装即可。

image-20231226152957370

配置支持C++23:

不能全局配置,只能为每个项目单独配置,右键项目名,在弹出菜单选择属性

要修改的位置1:

image-20231227095729973

要修改的位置2:

image-20231227095906477

PS:如果使用xmake管理项目,上面的配置则不需要!!! 详情配置在:xmake修改C++模板为C++23

Visual Studio Code

Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在桌面上运行,适用于Windows、macOS和Linux。它内置了对JavaScript、TypeScript和Node.js的支持,并为其他语言和运行时(如C++、C#、Java、Python、PHP、Go、.NET)提供了丰富的扩展生态系统

下载地址:https://code.visualstudio.com/

下载好直接安装即可。

xmake

xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。

虽然,简单易用是 xmake 的一大特色,但 xmake 的功能也是非常强大的,既能够像 Make/Ninja 那样可以直接编译项目,也可以像 CMake/Meson 那样生成工程文件,还有内置的包管理系统来帮助用户解决 C/C++依赖库的集成使用问题。

目前,xmake主要用于C/C++项目的构建,但是同时也支持其他native语言的构建,可以实现跟C/C++进行混合编译,同时编译速度也是非常的快,可以跟Ninja持平。

安装说明:https://xmake.io/#/zh-cn/guide/installation

方式一、Windows PowerShell 安装命令:

Invoke-Expression (Invoke-Webrequest 'https://xmake.io/psget.text' -UseBasicParsing).Content

方式二、下载安装包:

下载地址:https://github.com/xmake-io/xmake/releases

下载好直接安装即可。

Visual Studio Community

Visual Studio Code 安装 xmake 插件

直接插件商店搜索安装即可。

系统编译设置为UTF-8

如图所示:

image-20240615105229148

第 8 步 点完会提示重启,取消即可。当然也可选择直接重启。

环境配置-LLVM

Windows

windows 环境采用的版本:LLVM 下载地址:https://github.com/mstorsjo/llvm-mingw/releases

Linux

Linux 环境采用的版本:LLVM 下载地址:https://github.com/llvm/llvm-project/releases

不管系统如何,使用当前最新版本即可。

代码编辑器 VSCode 配置:

项目使用 VSCode 打开后会产生 .vscode 目录,以下文件放在 .vscode 目录内。

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "LLVM",
            "includePath": [
                "${workspaceFolder}/**",
                "D:\\Dev\\LLVM\\llvm-mingw\\include**" // Windows 示例,修改为你的实际路径
                // "/opt/llvm19/include**" // Linux 示例,修改为你的实际路径
            ],
            "defines": [],
            "compilerPath": "D:\\Dev\\LLVM\\llvm-mingw\\bin\\clang++.exe", // Windows 示例,修改为你的实际路径
            // "compilerPath": "/opt/llvm19/bin/clang++.exe", // Linux 示例,修改为你的实际路径
            "cStandard": "c23",
            "cppStandard": "c++23",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug with LLDB",
            "type": "lldb",
            "request": "launch",
            "program": "${workspaceFolder}\\build\\windows\\x64\\debug\\he.exe", // 可执行文件路径,修改为你的实际生成路径
            "args": [], // 启动时传递给程序的参数
            "cwd": "${workspaceFolder}", // 工作目录
            "stopOnEntry": false, // 是否在入口处停下
            "preLaunchTask": "Debug Build", // 在启动调试前执行的任务(如编译)
            "terminal": "integrated", // 使用 VSCode 内置终端
            "env": {},
            "MIMode": "lldb",
            "miDebuggerPath": "D:\\Dev\\LLVM\\llvm-mingw\\bin\\lldb.exe", // Windows 示例,修改为你的实际路径
            // "miDebuggerPath": "/opt/llvm19/bin/lldb.exe", // Linux 示例,修改为你的实际路径
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

settings.json

{
    "clang-format.executable": "D:\\Dev\\LLVM\\llvm-mingw\\bin\\clang-format.exe", // Windows 示例,修改为你的实际路径
    // "clang-format.executable": "/opt/llvm19/bin/clang-format.exe", // Linux 示例,修改为你的实际路径
    "clang-format.style": "Google", // 设置为 Google 风格
    "editor.formatOnSave": true, // 保存时自动格式化
    "editor.defaultFormatter": "ms-vscode.cpptools", // 设置默认格式化工具
    "C_Cpp.intelliSenseEngine": "disabled", // 关闭默认的 IntelliSense 引擎
    "C_Cpp.autocomplete": "default", // 启用默认的自动补全
    // "C_Cpp.autocomplete": "disabled", // 关闭默认的自动补全
    "clangd.path": "D:\\Dev\\LLVM\\llvm-mingw\\bin\\clangd.exe", // Windows 示例,修改为你的实际路径
    // "clangd.path": "/opt/llvm19/bin/clangd.exe", // Linux 示例,修改为你的实际路径
    "clangd.arguments": [
        "--background-index", // 在后台生成索引
        "--clang-tidy", // 启用 clang-tidy 来分析代码
        "--completion-style=detailed", // 提供详细的补全信息
        "--header-insertion=iwyu", // 自动补全时插入必要的头文件
        "--cross-file-rename=true", // 支持跨文件重命名
        "-std=c++23",
        "--log=verbose"
    ],
    "editor.wordBasedSuggestions": "off", // 关闭词汇级别的建议(避免干扰)
    "editor.suggestSelection": "first", // 提示列表中优先选择第一个候选项
    "files.associations": {
        "*.h": "cpp", // 让 .h 文件也作为 C++ 文件进行处理
        "*.mpp": "cpp",
        "*.hpp": "cpp"
    },
    "[cpp]": {
        "editor.defaultFormatter": "xaver.clang-format",
        "editor.quickSuggestions": {
            "comments": "on",
            "strings": "on",
            "other": "on"
        },
        "editor.wordBasedSuggestions": "matchingDocuments" // C++ 语言的词汇补全
    },
    "[json]": {
        "editor.defaultFormatter": "vscode.json-language-features"
    },
    "[c]": {
        "editor.wordBasedSuggestions": "matchingDocuments", // C 语言的词汇补全
        "editor.quickSuggestions": {
            "comments": "on",
            "strings": "on",
            "other": "on"
        },
    },
    "[cuda-cpp]": {
        "editor.wordBasedSuggestions": "matchingDocuments" // CUDA-C 语言的词汇补全
    },
    "[jsonc]": {
        "editor.defaultFormatter": "vscode.json-language-features"
    }
}

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Debug Build", // Debug 编译
            "type": "shell",
            "command": "xmake f -m debug --toolchain=llvm --runtimes=c++_shared -cv ; xmake -rv", // Windows 示例(PowerShell)
            "command": "xmake f -m debug --toolchain=llvm --runtimes=c++_shared -cv && xmake -rv", // Linux 示例
            "options": {
                "cwd": "${workspaceFolder}", // 指定工作目录为 "build" 子目录
                "env": {
                    "PATH": "${env:PATH};D:\\Dev\\LLVM\\llvm-mingw\\bin;D:\\Dev\\xmake;" // Windows 示例,以你实际安装路径为准
                    // "PATH": "${env:PATH}:/opt/llvm19/bin:/opt/xmake/bin" // Linux 示例,以你实际安装路径为准
                }
            },
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "Release Build", // Release 编译
            "type": "shell",
            "command": "xmake f -m release --toolchain=llvm --runtimes=c++_shared -cv ; xmake -rv", // Windows 示例(PowerShell)
            "command": "xmake f -m release --toolchain=llvm --runtimes=c++_shared -cv && xmake -rv", // Linux 示例
            "options": {
                "cwd": "${workspaceFolder}", // 指定工作目录为 "build" 子目录
                "env": {
                    "PATH": "${env:PATH};D:\\Dev\\LLVM\\llvm-mingw\\bin;D:\\Dev\\xmake;" // Windows 示例,以你实际安装路径为准
                    // "PATH": "${env:PATH}:/opt/llvm19/bin:/opt/xmake/bin" // Linux 示例,以你实际安装路径为准
                }
            },
            "group": {
                "kind": "build",
                "isDefault": false
            }
        },
        {
            "label": "Run", // 运行程序,需要先 Release Build 或者 Debug Build
            "type": "shell",
            "command": "xmake run",
            "options": {
                "cwd": "${workspaceFolder}", // 指定工作目录为 "build" 子目录
                "env": {
                    "PATH": "${env:PATH};D:\\Dev\\LLVM\\llvm-mingw\\bin;D:\\Dev\\xmake;" // Windows 示例,以你实际安装路径为准
                    // "PATH": "${env:PATH}:/opt/llvm19/bin:/opt/xmake/bin" // Linux 示例,以你实际安装路径为准
                }
            },
            "group": {
                "kind": "build",
                "isDefault": false
            }
        }
    ]
}

配置安装后,测试了Linux、Windows 平台,编译、运行、调式 都没有问题,但代码提示!!!

C++23 代码提示

目前只有Windows环境可行,使用 xmake 将项目转换为 VisualStudio 项目,命令如下:

# 配置项目信息
xmake f --toolchain=llvm --runtimes=c++_shared -cv --vs=2022
# 转换为 VisualStudio 项目
xmake project -k vsxmake

# 执行成功后会在项目目录生成 vsxmake2022 文件夹, 进入此目录,打开 “项目名.sln” 即可进行开发

TIPS: 使用 VisualStudio 开发的话无需配置 VSCode。

基础语法

待完成。。。

数据类型

待完成。。。

变量与常量

待完成。。。

运算符

待完成。。。

控制结构

待完成。。。

函数

待完成。。。

类与对象

待完成。。。

继承与多态

待完成。。。

模板

待完成。。。

STL标准库

待完成。。。

异常处理

待完成。。。

C++20新特性

待完成。。。

C++23新特性

待完成。。。

内存管理

待完成。。。

并发编程

待完成。。。

输入输出流

待完成。。。

C++调试与优化

待完成。。。