Yunfi

Yunfi

tg_channel
github
email

Configure clang single file compilation and clangd check (C++) in VSCode

Introduction#

Due to some reckless operations, I messed up my previous Ubuntu installation. Taking this opportunity, I switched the distribution of my WSL to Arch, and I also plan to use the LLVM toolchain in VSCode.
Installing Arch is very convenient, you can follow the instructions in How to Setup | ArchWSL official documentation (wsldl-pg.github.io) and you can get it done within 10 minutes.
However, using the LLVM toolchain in VSCode is not very convenient. I searched online for many tutorials, most of which require a project (such as CMake) to work with. But if you are just a college student doing homework, it is actually more convenient to use F5 directly.
The main steps are divided into two operations: using clang/lldb for compilation and debugging, and using clangd for autocompletion and checking. These two can be used independently, but most of the tutorials I found seem to mix them together.

My environment:
Windows 11, Arch Linux on WSL2
Environment that I think should work:
Any version of Windows that can install WSL

Using clang/lldb for single file compilation and debugging#

  1. Make sure that clang++ and libc++ are correctly installed.

    1. Check with clang++ -version and pacman -Qq|grep libc++.
    2. If not installed, clang++ is included in the clang package, so use yay -S clang if you use yay to manage AUR. The same goes for libc++.
  2. Enable the CodeLLDB plugin in VSCode (if there is an error downloading, you can download it manually using the URL provided in the error message, and then install it manually).

  3. Create a tasks.json file and place it in the .vscode folder.

    {
      // See https://go.microsoft.com/fwlink/?LinkId=733558
      // for the documentation about the tasks.json format
      "version": "2.0.0",
      "tasks": [
        {
          "type": "shell",
          "label": "clang++ build",
          "command": "clang++",
          "args": [
            "-std=c++17",
            "-stdlib=libc++",
            "-g",
            "${file}",
            "-fstandalone-debug", //to enable viewing std::string etc. when using lldb
            "-o",
            "${fileDirname}/build/${fileBasenameNoExtension}"
          ],
          "options": {
            "cwd": "${workspaceFolder}"
          },
          "problemMatcher": ["$msCompile"],
          "group": {
            "kind": "build",
            "isDefault": true
          },
          "detail": "Task generated by Debugger."
        }
      ]
    }
    
    • This tasks.json file is taken from the VSCode documentation, specifically Configure VS Code for Clang/LLVM on macOS (visualstudio.com), with some modifications for Linux.
    • My habit is to put all executable files in the ./build/ folder. If you don't do this, you need to change the file paths in steps 3 and 4, and ignore step 5.
  4. Create a launch.json file and place it in the .vscode folder.

    {
        // Use IntelliSense to learn about possible attributes.
        // Hover to view descriptions of existing attributes.
        // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "preLaunchTask": "clang++ build",
                "type": "lldb",
                "request": "launch",
                "name": "Debug",
                "program": "${workspaceFolder}/build/${fileBasenameNoExtension}",
                "args": [],
                "cwd": "${workspaceFolder}"
            }
        ]
    }
    
  5. Create a build folder in the workspace folder (otherwise there will be an error!!!).

  6. Press F5 to run.

Using clangd for autocompletion and code checking#

  1. Make sure that clangd is installed (it should be included in the same package as clang++).
  2. Install the clangd extension in VSCode.
  3. Enter which clangd in the terminal and note down the file directory.
  4. Create a settings.json file and place it in the .vscode folder.
{
    // Some settings for clangd, you can refer to the official documentation [Configuration (llvm.org)](https://clangd.llvm.org/config) 
    "clangd.arguments": [
    "--background-index",
    "--compile-commands-dir=${workspaceFolder}/build",
    "-j=32",
    "--folding-ranges",
    "--query-driver=/usr/sbin/clang++",
    "--clang-tidy",
    "--clang-tidy-checks=performance-*,bugprone-*",
    "--all-scopes-completion",
    "--header-insertion=iwyu",
    "--completion-style=detailed",
    "--function-arg-placeholders",
    "--header-insertion=iwyu",
    "--pch-storage=memory",
    "--pretty"
  ],
  "clangd.path": "/usr/sbin/clangd",//the dir get from step 3
  // The following two settings are for speeding up autocomplete
  "editor.quickSuggestionsDelay": 3,
  "editor.suggest.snippetsPreventQuickSuggestions": false
}

About the .clang-format file#

My habit is to put it directly under ~ (if your code is placed in your ~ and its subfolders).
To generate it, the official documentation's webpage is too ugly, so I directly configure it in CLion and then export it as .clang-format, which is both visual and convenient.
Here is my .clang-format file:

# Generated from CLion C/C++ Code Style settings
BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: None
AlignOperands: Align
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Always
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Always
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterReturnType: None
AlwaysBreakTemplateDeclarations: Yes
BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel: false
  AfterClass: false
  AfterControlStatement: Never
  AfterEnum: false
  AfterFunction: false
  AfterNamespace: false
  AfterUnion: false
  BeforeCatch: false
  BeforeElse: false
  IndentBraces: false
  SplitEmptyFunction: false
  SplitEmptyRecord: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
ColumnLimit: 0
CompactNamespaces: false
ContinuationIndentWidth: 8
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: true
MaxEmptyLinesToKeep: 2
NamespaceIndentation: All
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PointerAlignment: Right
ReflowComments: false
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 0
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
TabWidth: 4
UseTab: Never

Troubleshooting#

clangd server keeps crashing#

  • Solution: Do not add the --folding-ranges parameter.
    • If added, it will crash when analyzing the source code related to std::vector in the log, even if my code does not use std::vector. The reason will be analyzed later.

VSCode cannot connect to the internet correctly in WSL#

  • The main reason is that VSCode will use the proxy IP and port in Windows in WSL (usually 127.0.0.1:port). Therefore, we need to set the http_proxy and https_proxy for WSL, replacing 127.0.0.1 with the IP of Windows in the local area network.
Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.