Yunfi

Yunfi

tg_channel
github
email

VSCode 配置clang單文件編譯和clangd檢查(C++)

前情提要#

因為一些作死操作,把我之前用的 Ubuntu 搞崩了,借此機會把 wsl 的發行版改成了 Arch,vscode 也打算使用 llvm 全家桶。
安裝 Arch 非常方便,How to Setup | ArchWSL official documentation (wsldl-pg.github.io) 按著這個鏈接裡的方法,10 分鐘內就能搞定。
而用在 vscode 裡用 llvm 全家桶實在是很不方便,網上找了很多教程,大多是需要一個項目(比如 cmake)來進行的,但是如果只是大學生做作業的話,其實不如直接 F5 方便。
主要分為兩步操作,使用 clang/lldb 編譯和調試,以及使用 clangd 進行補全和檢查,這兩者應該是互相獨立的,可以只使用其中一個,但是找到的大多數教程好像都是兩個混在一起搞的。

我的環境:
Windows11, Arch Linux on WSL2
我覺得應該能行的環境:
任何可以安裝 wsl 的 Windows 版本

使用 clang/lldb 進行單文件編譯和調試#

  1. 確保 clang++libc++ 已經正確安裝

    1. clang++ -versionpacman -Qq|grep libc++ 檢查
    2. 沒有的話,clang++ 包含於 clang 包裡,yay -S clang 如果你用 yay 管理 AUR 的話,libc++ 同理
  2. vscode 已啟用 CodeLLDB 插件(報錯無法下載可以先按報錯給的 url 用瀏覽器下載,然後手動安裝)

  3. tasks.json,放入.vscode 文件夾中

    {
      // 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."
        }
      ]
    }
    
    • 這份 tasks.json 文件是我從 vscode 的文檔裡扒下來的,具體見 Configure VS Code for Clang/LLVM on macOS (visualstudio.com),因為我使用的是 Linux 進行了些許更改
    • 我的習慣是把所有的可執行文件放到 ./build/ 文件夾下,如果不這麼做的話,改變 3、4 步中的文件路徑,以及忽略第五步
  4. launch.json,放入.vscode 文件夾中

    {
        // 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. 在文件夾裡新建一個 build 文件夾(不然報錯!!!)

  6. 按 F5,就可以運行了

使用 clangd 自動補全、代碼檢查#

  1. 確保已安裝 clangd(應該和 clang++ 在一個包裡的)
  2. 安裝 vscode 插件 clangd
  3. 終端輸入 which clangd ,記下文件目錄
  4. settings.json,放入.vscode 文件夾中
{
    //關於clangd的一些設置,可以參考官方文檔 [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
  // 下面的兩項用於加速autocomplete
  "editor.quickSuggestionsDelay": 3,
  "editor.suggest.snippetsPreventQuickSuggestions": false
}

關於 .clang-format 文件#

我的習慣是直接放在 ~ 下(如果你的代碼都放在你的~和其子文件夾裡的話)
生成的話,官方文檔的那個網頁實在是太醜了,我直接選擇去 CLion 裡配好,然後導出為 .clang-format,既可視化又方便
貼一下我的.clang-format

# 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

故障排除#

clangd server 一直崩潰#

  • 解決方法:不要加 --folding-ranges 參數
    • 加了的話,看日誌會在分析到 std::vector 相關的源代碼的時候崩潰,即使我的代碼裡沒有用到 std::vector,原因以後再分析

VSCode 在 WSL 中無法正確聯網#

  • 主要原因是 vscode 會在 wsl 中使用在 Windows 下的代理 ip+ 端口(一般是 127.0.0.1:端口 ),所以我們需要給 WSL 設置 http_proxy 和 https_proxy,把 127.0.0.1 改成局域網下 windows 的 ip
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。