2022-03-30 VsCode中使用clangd插件的各种设置

编程之家收集整理的这篇文章主要介绍了2022-03-30 VsCode中使用clangd插件的各种设置编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

最近尝试clang编译c++,所以用了clangd插件代替mscpp插件,其中有不少问题,都是通过各种搜索,各种猜,才能完善,记录一下,以便广大同仁阅览。第一步,设置clang工具链,我用msys2构建的clang64工具链,这个搜一下,非常容易构建。第二步,下载vscode插件clangd,这是官方插件,由于与mscpp插件冲突,需要将mscpp关闭。第三步,设置clangd插件,这是最折腾的。设置clangd可执行文件的位置,一定要设置为你构建的clang64中的clangd可执行文件位置,

最近尝试clang编译c++,所以用了clangd插件代替mscpp插件,其中有不少问题,都是通过各种搜索,各种猜,才能完善,记录一下,以便广大同仁阅览。

第一步,设置clang工具链,我用msys2构建的clang64工具链,这个搜一下,非常容易构建。

第二步,下载vscode插件clangd,这是官方插件,由于与mscpp插件冲突,需要将mscpp关闭

第三步,设置clangd插件,这是最折腾的。

  1. 设置clangd可执行文件的位置,一定要设置为你构建的clang64中的clangd可执行文件位置,切记。

    因为安装插件,本身也下载一个clangd,但是那不能用,不能识别clang的标准库文件

  2. 设置clangd参数:编译器执行程序,提示风格,是否自动加头文件,启用clang-tIDy,当c++构建文件不存在时搜索位置。

           "clangd.arguments": [
           "--query-driver=K:\\msys64\\clang64\\bin\\clang*","--completion-style=detailed","--header-insertion=never","--clang-tIDy",],"clangd.fallbackFlags": [
           "-IK:\\msys64\\mingw64\\include\\"
           ],
  3. 设置编辑器格式化风格。这个需要在项目文件夹下建立一个 “ .clang-format ” 文件内容如下:我使用的时微软风格,没办法,习惯mscpp的format了。

---
Language:        Cpp
# BasedOnStyle:  Microsoft
AccessModifIErOffset: -2
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveMacros: None
AlignConsecutiveAssignments: None
AlignConsecutiveBitFIElds: None
AlignConsecutiveDeclarations: None
Alignescapednewlines: Right
Alignoperands:   Align
AlignTrailingComments: true
AllowAllArgumentsOnNextline: true
AllowAllConstructorInitializersOnNextline: true
AllowAllParametersOfDeclarationOnNextline: true
AllowShortEnumsOnASingleline: false
AllowShortBlocksOnASingleline: Never
AllowShortCaseLabelsOnASingleline: false
AllowShortFunctionsOnASingleline: None
AllowShortLambdasOnASingleline: All
AllowShortIfStatementsOnASingleline: Never
AllowShortLoopsOnASingleline: false
AlwaysBreakAfterDeFinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilinestrings: false
AlwaysBreakTemplateDeclarations: Multiline
AttributeMacros:
  - __capability
BinPackArguments: true
BinPackParameters: true
BraceWrapPing:
  AfterCaseLabel:  false
  AfterClass:      true
  AfterControlStatement: Always
  AfterEnum:       true
  AfterFunction:   true
  Afternamespace:  true
  AfterObjCDeclaration: true
  AfterStruct:     true
  AfterUnion:      false
  AfterExternBlock: true
  BeforeCatch:     true
  BeforeElse:      true
  BeforeLambdaBody: false
  BeforeWhile:     false
  IndentBraces:    false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptynamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Custom
BreakBeforeinheritanceComma: false
BreakinheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFIEldAnnotations: false
BreakStringliterals: true
Columnlimit:    80
CommentPragmas:  '^ IWYU pragma:'
Compactnamespaces: false
ConstructorInitializerAllOnOnelineOrOnePerline: false
ConstructorInitializerIndentWIDth: 4
ContinuationIndentWIDth: 4
Cpp11BracedListStyle: true
DerivelineEnding: true
DerivePointeralignment: false
disableFormat:   false
EmptylineAfteraccessModifIEr: Never
EmptylineBeforeAccessModifIEr: LogicalBlock
ExperimentalautoDetectBinPacking: false
FixnamespaceComments: true
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
IfMacros:
  - KJ_IF_MAYBE
IncludeBlocks:   Preserve
IncludeCategorIEs:
  - Regex:           '^"(llvm|llvm-c|clang|clang-c)/'
    Priority:        2
    SortPriority:    0
    CaseSensitive:   false
  - Regex:           '^(<|"(gtest|gmock|isl|Json)/)'
    Priority:        3
    SortPriority:    0
    CaseSensitive:   false
  - Regex:           '.*'
    Priority:        1
    SortPriority:    0
    CaseSensitive:   false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifIErs: false
IndentCaseLabels: false
IndentCaseBlocks: false
IndentGotolabels: true
IndentPPDirectives: None
IndentExternBlock: AfterExternBlock
IndentRequires:  false
IndentWIDth:     4
IndentWrappedFunctionnames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapimports: true
KeepEmptylinesAtTheStartOfBlocks: true
LambdaBodyIndentation: Signature
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptylinesToKeep: 1
namespaceIndentation: None
ObjCBinPackProtocolList: auto
ObjCBlockIndentWIDth: 2
ObjCBreakBeforenestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnline: 1000
PenaltyIndenteDWhitespace: 0
Pointeralignment: Right
PPIndentWIDth:   -1
ReferenceAlignment: Pointer
ReflowComments:  true
Shortnamespacelines: 1
SortIncludes:    CaseSensitive
SortJavaStaticimport: Before
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentoperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeinheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceAroundPointerQualifIErs: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles:  Never
SpacesInConditionalStatement: false
SpacesInContainerliterals: true
SpacesInCStyleCastParentheses: false
SpacesInlineCommentPrefix:
  Minimum:         1
  Maximum:         -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
BitFIEldColonSpacing: Both
Standard:        Latest
StatementAttributelikeMacros:
  - Q_EMIT
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION
TabWIDth:        4
UseCRLF:         false
UseTab:          Never
WhitespaceSensitiveMacros:
  - STRINGIZE
  - PP_STRINGIZE
  - BOOST_PP_STRINGIZE
  - NS_SWIFT_name
  - CF_SWIFT_name
...

  1. 设置clangd tIDy规则,用于静态分析提示,需要在项目文件夹下建立“ .clang-tIDy ”文件内容如下:我设置的比较多,通常会导致各种提示问题,如果觉得烦,可以自主选择,需参考clangd官方文档。
---
Checks: "BUGprone-*,\
Google-*,\
misc-*,\
modernize-*,\
performance-*,\
readability-*,\
portability-*,\
"
headerFilterRegex: 'Source/cm[^/]*\.(h|hxx|cxx)$'
CheckOptions:
  - key:   modernize-use-default-member-init.UseAssignment
    value: '1'
  - key:   modernize-use-equals-default.IgnoreMacros
    value: '0'
  - key:   modernize-use-auto.MinTypenameLength
    value: '80'
...

  1. 设置模拟编译环境

根据官方文档,需要通过cmake为每个文件设置compile_commands.Json文件,如果可以的话,请照做。这个设置的话,对于只用系统库的编程,没有问题

但涉及到非系统库头文件时候,就比较蛋疼。你无法指定文件位置,只能用第二条的 “ clangd.fallbackFlags ” 设置。然而所有头文件都会视为C++文件标准,如果你编辑C头文件,会痛不欲生。对于我这样写袖珍程序的主儿,这个不能忍。

解决办法是在你的每个子项目文件夹里添加一个 “ compile_flags.txt ” 文件内容很简单:设置代码类型:C是 " -xc ",C++是 " -xc++ ",不可混用。设置C或C++的标准,一般C++11即可,版本太高,编译器不一定有实现。

-xc
-std=c11
-Wall
-Ik:/msys64/mingw64/include/
-Ik:/msys64/mingw64/include/cuda/

通过以上的设置,基本就可以比较愉快的使用clangd协助编程了。

还有一个问题,就是deBUG,把mscpp禁用的后果是无法deBUG, 而clang的认deBUG工具是lldb,下载请认准:
CodeLLDB Vadim Chugunov

补充一下deBUG问题

这是deBUG时的launch文件,在vscode可以直接添加配置,基本就是这个样子,比msCPP的设置简化很多,只是type变成了lldb,其余是一样的,Code LLDB会完成剩下的deBUG问题
提醒一下,CodeLLDB插件认配置不要轻易动,尤其涉及lldb路径问题,一定要用插件自己下载的,不要用Clang64工具链中的,这个和clangd设置相反,切记。

        {
            "name": "clang",
            "type": "lldb",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.exe",
            "args": [
            ],
            "cwd": "${workspaceFolder}",
            "sourceLanguages": [
                "C"
            ],
            "p@R_610_4404@Task": "clangBuild_C",
        },
        {
            "name": "clang++",
            "sourceLanguages": [
                "C++"
            ],
            "p@R_610_4404@Task": "clangBuild_C++"
        },

lldb插件可以近乎完美解决deBUG问题,只有一个问题,就是在终端显示错误无法映射到 “问题” 窗口,原因比较简单,原先用于gcc的problemmatcher无法捕捉clang返回的问题,毕竟不是一种编译器。

估计由于只有百万级开发者使用clang在vscode中编程,未能引起vscode团队的重视。所以需要自己设置

这个问题困扰了我很久,经过翻阅各种issue,得到解决,这是在tasks中的完整实现:最难之处是多行正则匹配语法,见problemmatcher部分,可以解决一些问题。上边是clang用于编译C的,下边是用于clang++用于编译C++的。

{
            "type": "process",
            "label": "clangBuild_C",
            "command": "K:\\msys64\\clang64\\bin\\clang.exe",
            "args": [
                "-glldb",
                "-std=c11",
                "${fileBasenameNoExtension}*",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemmatcher": {
                "owner": "lldb",
                "fileLocation": [
                    "relative",
                    "${fileDirname}"
                ],
                "pattern": [
                    {
                        "regexp": "^(ld.lld:.*)$",
                        "message": 1,
                    },
                    {
                        "regexp": ">>> referenced by (.*):(\\d+)",
                        "file": 1,
                        "line": 2,
                ]
            }
        },
        {
            "type": "process",
            "label": "clangBuild_C++",
            "command": "K:\\msys64\\clang64\\bin\\clang++.exe",
                "-std=c++11",
                "${fileBasename}",
                "-Ik:/msys64/mingw64/include/",
                "pattern": {
                    "regexp": "^(.*\\.cpp):(\\d+):(\\d+): (.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "message": 4
                },
            }
        }

我的.vscode\settings.Json 文件中关于lldb插件设置

{
    "lldb.consoleMode": "evaluate",    //调试控制台模式为终端命令模式,可调用lldb命令
    "lldb.launch.sourceLanguages": [   //调试语言
        "cpp",
        "c"
    ],
    "lldb.launch.Expressions": "native",  //使用原生表达式
    "lldb.displayFormat": "auto",
    "lldb.dereferencePointers": false,
    "lldb.showdisassembly": "auto",
}

有以上设置,就可以进行常规的lldb的deBUG了,比如有个变量temp,想要看他的值和地址,在调试控制台输入`p a,`p &a 即可,和在终端进行deBUG是一样的。

这里记录一点私货,如何监视动态数组值,比如有一个struct 指针pf1,scores是pf1中一个含有5个double数据的动态数组:请用vscode的deBUG监视输入:

(double(*)[5])pf1->scores

如果用控制台`p (double(*)[5])pf1->scores 会返回一个指针。

再加一项,文件重定向

在vscode中使用lldb,是不可以直接用args方法的,如下设置不通。

            "args": [
                "(A*B|AC)D",
                "<",
                "E:\\clangC++\\suanfa\\data\\tinyL.txt",

lldb插件有个自己的关键词设置:stdio

            "stdio": [
                "E:\\clangC++\\suanfa\\data\\tinyL.txt",
                "stu1.txt",

第一项是标准输入,第二项是标准输出,如果有第三项,是标准err,请务必注意,这条它的官网有,但我没看,是自己试验出来的,虽然对初学者不常用,但对工程调试,没有这个大概会疯。

如有问题,请访问:clangd官方地址

总结

以上是编程之家为你收集整理的2022-03-30 VsCode中使用clangd插件的各种设置全部内容,希望文章能够帮你解决2022-03-30 VsCode中使用clangd插件的各种设置所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

Swift文章

最正确的方法就是去编译后的包里查看。步骤:1、先运行一下项目。2、找到编译后的目录。有两种方法:直接访问/通过XCode进入(1)直接访问编译后的文件路径:/Users/用户名/Library/Developer/Xcode/DerivedData/工程名-sdsdfsfdsfdsdfsf/Build/Products,文件下面有XXX-iphoneos,XXXX-iphonesimulator样式的文件夹。选择符合我们运行设备和版本的文件夹,点击进入。(2)可以通过Xco.
前言在iOS原生开发的时候,凡是涉及到运行项目之后Xcode提示Build target Runner-Log,是不是每次看到这种报错提示就觉得眼前一黑,头皮发麻?其实也没我说的那么夸张,但是有时候遇到这种问题确实比较费头发。本篇文章就来分享一个常见的问题,但是该问题解决起来不复杂,分享出来,方便后期查阅使用。重现报错提示具体在Xcode中的报错提示如下所示:Showing Recent Messagesdiff: /Users/admin/Documents/WorkSpac
本文将会给出2022年软件行业的编程语言、薪水、就业以及技术的深度分析数据全文较长,建议收藏之后,慢慢看文章目录一、最受欢迎的语言 二、最值得学习的语言 三、薪水/工资分析 四、就业状况 五、协作工具数据 六、网络框架分析 七、数据库排名软件开发行业正在全球范围内快速发展。因此,重要的是要掌握最流行的编程语言,以便在这个竞争激烈的行业中建立前途似锦的职业生涯。您可能不必掌握我们今天讨论的所有语言,但您的简历中掌握的语言越多,在 2022 年和未来几年内,就越有客户和开.
~/Library/Developer/Xcode/iOS Device Logs清空 Products~/Library/Developer/Xcode/ProductsXcode 12 及之后版本 还有3个占用内存的文件分别是:第一名:iOS.simruntime 10.29 GB (iOS 日常开发需要使用,勿删)第二名:watchOS.simruntime 7.05 GB (不做 watch 开发可以删除)第三名:tvOS.simruntime 5.39 G
Swift与OC的混编可以总结出以下几种场景OC&amp;Swift Mixed In The Same TargetProject中OC 调用 SwiftPod中OC 调用 SwiftProject中Swift 调用 OCPod中Swift 调用 OCOC&amp;Swift Mixed In The Different TargetOC Project 调用 Swift PodSwift Project 调用 OC PodOC Pod 调用 Swift PodSwift
最近数据结构实践课经常需要进行二进制文件读写,总结出以下经验:1. 读写二进制文件最好加上ios::binary2. 二进制文件用fstream读写时既可以输入又可以输出,此模式下可以实现只修改文件部分内容例如,我创建了含有100个数的二进制文件data_unsorted.dat,生成结果如下:写入如下代码(ios::in不能少) file.open("data_unsorted.dat", ios::binary | ios::in | ios::out); in.
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注