Skip to content

vscode_clang

1273字约4分钟

2024-12-02

1.首先是下载,解压(注意使用管理员权限解压) 下载链接
2.将/.../llvm/bin/.../x86_64-windows-gnu/bin 路径添加到用户path 3.安装clangd插件 4.创建一个项目文件夹此处为helloproject,进入文件夹,右键打打开powershell 5.测试clang clang --version 测试cmake cmake --version 测试ninja ninja --version

编写一个最简单hello.cpp文件保存

首先编写CmakeLists.txt和CmakePresets.json

cmake_minimum_required(VERSION 3.5.0)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED true)
set(CMAKE_CXX_EXTENSIONS OFF)

project(hello)

add_executable(hello hello.cpp)
{"version": 8,
    "configurePresets": [
        {
            "name": "clang",
            "hidden": false,
            "generator": "Ninja",
            "binaryDir": "${sourceDir}/build/${presetName}",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Debug",
                "CMAKE_C_COMPILER": "D:\\workfile\\compiler\\clang\\llvm\\bin\\clang.exe",
                "CMAKE_CXX_COMPILER": "D:\\workfile\\compiler\\clang\\llvm\\bin\\clang++.exe",
                "CMAKE_CXX_FLAGS": "--target=x86_64-windows-gnu --sysroot=D:\\workfile\\compiler\\clang\\x86_64-windows-gnu -fuse-ld=lld  -rtlib=compiler-rt -unwindlib=libunwind  -lc++abi -lunwind -lntdll -Wno-unused-command-line-argument  -fcolor-diagnostics -stdlib=libc++",
                "CMAKE_C_FLAGS": "--target=x86_64-windows-gnu --sysroot=D:\\workfile\\compiler\\clang\\x86_64-windows-gnu -fuse-ld=lld -rtlib=compiler-rt -unwindlib=libunwind  -lc++abi -lunwind -lntdll -Wno-unused-command-line-argument -fcolor-diagnostics "
            }
        }
    ]
}

在当前项目文件夹下打开powershell,或使用vscode的终端,依次输入一下命令

cmake -Bbuild --preset clang .

ninja -C build hello

./hello

这就是完整的使用cmake和ninja的构建,并执行的过程。 准备工作做好后 首先开始配置vscode相关配置 1.taskjson taskjson相当于任务配置文件,而一个task任务相当于执行一个个命令行命令。把一个个命令行命令抽象成任务。 也就是说用taskjson中的任务代替你执行上述的命令 相比每次开始新项目时重新写taskjson,vscode支持配置默认任务。这是写在C:\Users<用户名>\AppData\Roaming\Code\User\profiles文件中的全局任务设置。

当然这里我们先选择配置任务而不是默认生成的任务,注意这个默认生成的任务是全局的.点击配置任务后,命令面板也就是出现的下拉框。如果之前没有配置本地任务,则会出现使用模板创建taskjson文件,点击后,选择Other后会在本地项目的文件夹下创建一个.vscode文件夹其中包含一个task.json文件。其中包含了vscode模板创建的任务一般为 echo Hello

  • helloproject
    • .vscode
      • task.json
    • build
    • Cmakefile
      • ...
    • .ninja_deps
    • .ninja_log
    • build.ninja
    • cmake_install.cmake
    • CmakeCache.txt
    • hello.exe
    • CmakeLists.txt
    • CmakePresets.json
    • hello.cpp

首先提供以下三个最基础的代替上述命令的任务

"version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "cmake-build",
            "command": "cmake",
            "args": [
                "-Bbuild",
                "--preset",
                "clang",
                "."
            ],
            "options": {
                "cwd": "${workspaceFolder}/"
            },
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "cmake构建",
            "problemMatcher": []
        },
        {
            "type": "shell",
            "label": "ninja-make",
            "command": "ninja ",
            "args": [
                "-v"
            ],
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": false
            },
            "detail": "ninja编译"
        },
        {
            "label": "执行",
            "type": "shell",
            "command": "./hello",
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "执行exe",
            "dependsOrder": "sequence",
            "dependsOn": [
                "cmake-build",
                "ninja-make"
            ]
        }
    ]

保存task.json文件后点击vscode的任务栏的终端选项,点击运行任务。在出现的下拉框中点击执行。 vscode的终端列表会按顺序执行,之前的三个任务。不过这还不够,我们需要对vscode的任务与生成的cmake做更多的定制,以便于像使用ide一样顺畅,当然我们也可以选择使用一些插件这些后续再述

了解task.json

参考链接

简单介绍一些每个任务的属性
1.label : 2.type : 3.command: 4.options: 5.problemMatcher: 6.group: 7.detail: 8.dependsOrder: 9.dependsOn:

$env:path.split(";")

clang++ -o main.exe main.cpp --target=x86_64-windows-msvc --sysroot=D:\workfile\compiler\windows-msvc-sysroot -fuse-ld=lld -D_DLL=1 -lmsvcrt -flto=thin


-L<dir>, --library-directory <arg>, --library-directory=<arg>
Add directory to library search path

-flto-jobs=<arg>
Controls the backend parallelism of -flto=thin (default of 0 means the number of threads will be derived from the number of CPUs detected)

-flto=<arg>, -flto (equivalent to -flto=full), -flto=auto (equivalent to -flto=full), -flto=jobserver (equivalent to -flto=full)
Set LTO mode. <arg> must be thin or full.

-fuse-ld=lld 指定链接器为lld

-rtlib=compiler-rt 指定[低级运行时库](https://compiler-rt.llvm.org/)


-unwindlib=libunwind 这玩意不支持windows系统时是给 elf格式文件用的 参考[这个](https://github.com/libunwind/libunwind)

指定栈回退的库确定 ELF 程序执行线程的当前调用链,并在该调用链的任意点恢复执行。主要是处理异常和调用栈(debug)

-unwindlib=<arg>, --unwindlib=<arg>
Unwind library to use. <arg> must be libgcc,unwindlib or platform.

-lunwind 链接unwind库

-lc++abi  链接cxxabi 库 这玩意是为了生成的abi兼容 libc++abi is a new implementation of low level support for a standard C++ library.
简单说就是libc++的底层实现比如异常的一些[玩意](https://libcxxabi.llvm.org/)


-lntdll ntdll 是windows的内核dll NT Layer DLL  包含一些系统调用 异常处理等功能


-stdlib=<arg>, --stdlib=<arg>, --stdlib <arg>
C++ standard library to use. <arg> must be libc++,libstdc++ or platform.

-Wno-unused-command-line-argument 关闭未使用参数的警告

cmake --build . 在build文件夹下编译项目

cmake --build ./build -t(--target) <目标>

ninja -C build 两步操作1.进入build文件夹2.编译项目

ninja -C build <目标>同上

在build文件夹下 ninja -t clean 清除构建文件

ninja <目标> 编译对应项目 有时你的引入的库依赖太多文件 此时只构建你的目标文件

ninja -v 详细模式构建所有目标