vscode+clangd远程服务器看linux内核源码,完美替换source insight

vscode插件需求

插件共有以下几个:

  1. C/C++
  2. clangd
  3. Remote - SSH

插件设置

C/C++ 1插件在这里只需要提供基础的C/C++服务即可,不需要语法解析,自动跳转和补全功能。所以需要关闭C/C++,在vscode设置里搜索C_Cpp: Intelli Sense Engine,选择disabled

Remote - SSH插件用于远程连接服务器或者是虚拟机。配置一下IP及端口即可。ctrl+shift+p:搜索Remote-SSH:Open SSH Configuration File。输入自己的服务器IP及端口,例:

Host xxxx
    HostName 192.168.1.111
    User xxx
    Port xx

clangd插件,远程连接到服务器后在内核工程目录创建.vscode文件夹,里面新建settings.json,内容如下:

{
    "clangd.arguments": [
        "--all-scopes-completion",
        "--clang-tidy",
        "--completion-parse=always",
        "--header-insertion=never",
        "--completion-style=detailed",
        "--query-driver=***/***/***gcc",//这里是自己的交叉编译路径
        "--function-arg-placeholders=false",
        "--compile-commands-dir=${workspaceFolder}/",
        "-log=info",
        "-j=32"
    ],
    "clangd.checkUpdates": true,
}

工具需求

  1. bear
  2. clangd

bear编译

bear用于创建compile_commands.json文件,该文件详细描述各个代码文件的编译命令,便于clangd建立代码工程。

下载bear源码:bear下载链接。推荐下载2.4.3的版本。

tar -xvf Bear-2.4.3.tar.gz
cd Bear-2.4.3
camke ./ -DCMAKE_INSTALL_PREFIX=${install_dir}
make all -j32
make install

${install_dir}/bin添加到$PATH里,将${install_dir/lib64/bear}添加到$LD_LIBRARY_PATH

clangd编译

clangd可以根据compile_commands.json文件建立索引数据库。从而达到索引各种符号的目的。
clangd是在llvm工程里的。所以下载llvm的工程源码llvm源码,下载llvm-project-xx.x.x.src.tar.xz文件,这个才是工程源码。

cmake -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DCMAKE_INSTALL_PREFIX=~/${install_dir} -DCMAKE_BUILD_TYPE=Release ../llvm -DCMAKE_CXX_COMPILER=${g++_dir}/g++ -DCMAKE_C_COMPILER=${gcc_dir}/gcc
make -j32
make install

${install_dir}/bin添加到$PATH里,将${install_dir/lib}添加到$LD_LIBRARY_PATH

内核索引

bear make ARCH=arm64 CROSS_COMPILE=xxx

在编译命令前加上bear就可以生成compile_commands.json文件了。之后就可以愉快的索引了。

设置代码风格及静态检查项

代码工程目录下可以新建.clangd文件,该文件描述了要启用的静态检查项,也可以去除clang无法识别的一些编译指令,这里给个例子,可以参考我这个配置,也可以参考这个网站clang analyzer

Diagnostics:
  ClangTidy:
    Add:#添加的代码检查项
    [
      clang-analyzer-*,
      modernize-*,
      bugprone-*,
      performance-*,
      portability-*,
      readability-*,
      cppcoreguidelines-no-malloc,
      cppcoreguidelines-macro-usage,
      cppcoreguidelines-pro-bounds-pointer-arithmetic,
      bugprone-infinite-loop,
      bugprone-argument-comment,
      bugprone-assert-side-effect,
      bugprone-bad-signal-to-kill-thread,
      bugprone-branch-clone,
      bugprone-copy-constructor-init,
      bugprone-dangling-handle,
      bugprone-dynamic-static-initializers,
      bugprone-fold-init-type,
      bugprone-forward-declaration-namespace,
      bugprone-forwarding-reference-overload,
      bugprone-inaccurate-erase,
      bugprone-incorrect-roundings,
      bugprone-integer-division,
      bugprone-lambda-function-name,
      bugprone-macro-parentheses,
      bugprone-macro-repeated-side-effects,
      bugprone-misplaced-operator-in-strlen-in-alloc,
      bugprone-misplaced-pointer-arithmetic-in-alloc,
      bugprone-misplaced-widening-cast,
      bugprone-move-forwarding-reference,
      bugprone-multiple-statement-macro,
      bugprone-no-escape,
      bugprone-not-null-terminated-result,
      bugprone-parent-virtual-call,
      bugprone-posix-return,
      bugprone-reserved-identifier,
      bugprone-sizeof-container,
      bugprone-sizeof-expression,
      bugprone-spuriously-wake-up-functions,
      bugprone-string-constructor,
      bugprone-string-integer-assignment,
      bugprone-string-literal-with-embedded-nul,
      bugprone-suspicious-enum-usage,
      bugprone-suspicious-include,
      bugprone-suspicious-memory-comparison,
      bugprone-suspicious-memset-usage,
      bugprone-suspicious-missing-comma,
      bugprone-suspicious-semicolon,
      bugprone-suspicious-string-compare,
      bugprone-swapped-arguments,
      bugprone-terminating-continue,
      bugprone-throw-keyword-missing,
      bugprone-too-small-loop-variable,
      bugprone-undefined-memory-manipulation,
      bugprone-undelegated-constructor,
      bugprone-unhandled-self-assignment,
      bugprone-unused-raii,
      bugprone-unused-return-value,
      bugprone-use-after-move,
      bugprone-virtual-near-miss,
            cert-dcl21-cpp,
      cert-dcl58-cpp,
      cert-err34-c,
      cert-err52-cpp,
      cert-err58-cpp,
      cert-err60-cpp,
      cert-flp30-c,
      cert-msc50-cpp,
      cert-msc51-cpp,
      cert-str34-c,
      cppcoreguidelines-interfaces-global-init,
      cppcoreguidelines-narrowing-conversions,
      cppcoreguidelines-pro-type-member-init,
      cppcoreguidelines-pro-type-static-cast-downcast,
      cppcoreguidelines-slicing,
      google-default-arguments,
      google-explicit-constructor,
      google-runtime-operator,
      hicpp-exception-baseclass,
      hicpp-multiway-paths-covered,
      misc-misplaced-const,
      misc-new-delete-overloads,
      misc-no-recursion,
      misc-non-copyable-objects,
      misc-throw-by-value-catch-by-reference,
      misc-unconventional-assign-operator,
      misc-uniqueptr-reset-release,
      modernize-avoid-bind,
      modernize-concat-nested-namespaces,
      modernize-deprecated-headers,
      modernize-deprecated-ios-base-aliases,
      modernize-loop-convert,
      modernize-make-shared,
      modernize-make-unique,
      modernize-pass-by-value,
      modernize-raw-string-literal,
      modernize-redundant-void-arg,
      modernize-replace-auto-ptr,
      modernize-replace-disallow-copy-and-assign-macro,
      modernize-replace-random-shuffle,
      modernize-return-braced-init-list,
      modernize-shrink-to-fit,
      modernize-unary-static-assert,
      modernize-use-auto,
      modernize-use-bool-literals,
      modernize-use-emplace,
      modernize-use-equals-default,
      modernize-use-equals-delete,
      modernize-use-nodiscard,
      modernize-use-noexcept,
      modernize-use-nullptr,
      modernize-use-override,
      modernize-use-transparent-functors,
      modernize-use-uncaught-exceptions,
      openmp-use-default-none,
      performance-faster-string-find,
      performance-for-range-copy,
      performance-implicit-conversion-in-loop,
      performance-inefficient-algorithm,
      performance-inefficient-string-concatenation,
      performance-inefficient-vector-operation,
      performance-move-const-arg,
      performance-move-constructor-init,
      performance-no-automatic-move,
      performance-noexcept-move-constructor,
      performance-trivially-destructible,
      performance-type-promotion-in-math-fn,
      performance-unnecessary-copy-initialization,
      performance-unnecessary-value-param,
      portability-simd-intrinsics,
      readability-avoid-const-params-in-decls,
      readability-const-return-type,
      readability-container-size-empty,
      readability-convert-member-functions-to-static,
      readability-delete-null-pointer,
      readability-inconsistent-declaration-parameter-name,
      readability-make-member-function-const,
      readability-misleading-indentation,
      readability-misplaced-array-index,
      readability-redundant-control-flow,
      readability-redundant-declaration,
      readability-redundant-function-ptr-dereference,
      readability-redundant-smartptr-get,
      readability-redundant-string-cstr,
      readability-redundant-string-init,
      readability-simplify-subscript-expr,
      readability-static-accessed-through-instance,
      readability-static-definition-in-anonymous-namespace,
      readability-string-compare,
      readability-uniqueptr-delete-release,
      readability-use-anyofallof,
      
    ]
    Remove:#忽略的代码检查项
    [
      readability-function-cognitive-complexity,
      readability-identifier-length,
      readability-magic-numbers,
      readability-non-const-parameter,
      bugprone-easily-swappable-parameters,
      readability-misleading-indentation,
      readability-isolate-declaration,
      readability-braces-around-statements,
    ]
CompileFlags:                             
  Add: #添加的编译标志
    [
      -W,
      -Wall,
      -Wshadow,
      -Wtype-limits,
      -Wasm,
      -Wchkp,
      -Warray-parameter,
      -Wthread-safety,
      -Wswitch-default,
      -Wuninitialized,
      -Wunused-label,
      -Wunused-lambda-capture,
      -Wno-error=unused-command-line-argument-hard-error-in-future,
      -Wno-sign-compare,
      -Wno-void-pointer-to-int-cast,
      -Wno-int-to-pointer-cast,
      -Wno-asm_invalid_global_var_reg,
      -Wno-format,
      --target=aarch64-linux-gnu,
    ]
  Remove:#忽略的编译标志
    [
      -mabi=lp64,
      -fno-var-tracking-assignments,
      -fconserve-stack,
    ]
    
      
InlayHints:#嵌入提示
  Enabled: Yes
  ParameterNames: Yes
  DeducedTypes: Yes

Hover:
  ShowAKA: Yes

配置clangd工程代码风格

clangd支持一键格式化代码,索引,空格,换行,变量命名规则等都可以设置,在工程下新建.clang-format文件,具体怎么设置可以参考我的工程配置和这个网站clang format

# Generated from CLion C/C++ Code Style settings

BasedOnStyle: Microsoft

#头文件排序
SortIncludes: Never

#转义换行符对齐
AlignEscapedNewlines: Left

#对齐注释
AlignTrailingComments: true

# 连续赋值时,对齐所有等号
AlignConsecutiveAssignments: 
  Enabled: true
  #跨空行对齐
  AcrossEmptyLines: true
  #跨注释对齐
  AcrossComments: false
  #填充空格
  PadOperators: true
  AlignCompound: true
 
# 连续声明时,对齐所有声明的变量名
AlignConsecutiveDeclarations: 
  Enabled: true
  AcrossEmptyLines: true
  AcrossComments: false
  PadOperators: true
  AlignCompound: true

#对齐宏
AlignConsecutiveMacros:
  Enabled: true
  AcrossEmptyLines: true
  AcrossComments: false
  PadOperators: true

#访问修饰符的额外缩进或升级,例如 .public:
AccessModifierOffset: -4

#将参数水平对齐在左括号之后
AlignAfterOpenBracket: Align

#对结构数组使用初始化时,会将字段对齐到列中
AlignArrayOfStructures: Left

#对齐连续位字段的样式
AlignConsecutiveBitFields: false

#水平对齐二元表达式和三元表达式的操作数
AlignOperands: Align

#如果函数调用或带大括号的初始值设定项列表不适合某一行,则允许将所有参数放在下一行
AllowAllArgumentsOnNextLine: false

#如果函数声明不适合某一行,则允许将函数声明的所有参数放在下一行
AllowAllParametersOfDeclarationOnNextLine: false

#根据值,可以放在一行上
AllowShortBlocksOnASingleLine: Never

#短的case将被收缩到一行
AllowShortCaseLabelsOnASingleLine: false

#允许在一行上使用短枚举
AllowShortEnumsOnASingleLine: false

#短的函数可以放在一行 None:永远不放在一行
AllowShortFunctionsOnASingleLine: None

#根据值,if可以放在一行上
AllowShortIfStatementsOnASingleLine: Never

#根据值,可以放在一行上
AllowShortLambdasOnASingleLine: None

#如果 ,可以放在一行上
AllowShortLoopsOnASingleLine: false

#函数声明返回要使用的类型中断样式
AlwaysBreakAfterReturnType: None

#要使用的模板声明中断样式
AlwaysBreakTemplateDeclarations: Yes

#如果 ,则函数调用的参数要么全部在同一行上,要么每个参数都有一行
BinPackArguments: true


BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel: true
  AfterClass: true
  AfterControlStatement: Always
  AfterEnum: true
  AfterStruct: true
  AfterFunction: true
  AfterNamespace: true
  AfterUnion: true
  AfterExternBlock: true
  BeforeCatch: true
  BeforeElse: true
  IndentBraces: false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
ColumnLimit: 80
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: false
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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在Source Insight中添加Linux内核源码,可以按照以下步骤进行操作: 1. 首先,创建一个新的Source Insight项目,并停留在项目界面上。 2. 在Linux内核源码目录中进行完整的编译,将编译时的输出信息保存到一个文件中,例如build_log.txt。 3. 在Source Insight项目界面上,点击菜单栏的"Project",然后选择"Add Files to Project"。 4. 在弹出的对话框中,选择"Specify Source Files",然后点击"Next"。 5. 在下一个对话框中,点击"..."按钮选择Linux内核源码的目录,然后点击"OK"。 6. 在同一个对话框中,点击"Add Files"按钮,选择之前保存的编译输出文件build_log.txt,然后点击"Next"。 7. 在下一个对话框中,选择"Add All",然后点击"Next"。 8. 在最后一个对话框中,点击"Finish"完成添加源码文件的操作。 通过以上步骤,你就可以成功地将Linux内核源码添加到Source Insight项目中了。这样,你就可以使用Source Insight来查看和编辑Linux内核源码了。\[2\] #### 引用[.reference_title] - *1* *3* [使用 Source Insight 阅读 Linux 内核源码](https://blog.csdn.net/thisway_diy/article/details/108746072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SourceInsight 精确导入Linux kernel源码的方法](https://blog.csdn.net/heybeaman/article/details/80791928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值