vscode/vim+clangd 环境中实现正确索引交叉编译链中系统头文件路径

vscode/vim+clangd 环境中实现正确索引交叉编译链中系统头文件路径

(本文假定读者已经对VSCode、LSP、clangd等相关知识有所了解,如果读者对相关内容尚未熟悉,建议先学习VSCode+LSP原理,再学习clangd插件的完整用法,clangd插件官方指导网站网站为:https://clangd.llvm.org,强烈建议认真完整的学习该网站的所有内容!)

自从谷歌创造了V8引擎(演化出node.js,他是VSCode和coc.nvim插件的基础),微软创造了VSCode和LSP协议,苹果创造了clang和clangd,C/C++编辑器领域就发生了翻天覆地的变化,先是VSCode + Remote-SSH + clangd插件通过LSP和clangd语言服务器实现了先进的 “语法级” 跳转 + 补全 + 高亮 + 语法静态解析 + 源码格式化体验,后是vim世界通过移植VSCode源码实现重量级的coc.nvim插件(从此vim几乎可以和VSCode实现同步进化)。目前几乎所有的编辑器都在利用LSP生态在快速的打造全新的功能特性。个人通过一段时间学习和配置,目前发现这套环境用来查看Linux内核源码简直是神一般的存在。

clangd之所以可以完美的匹配Linux内核项目主要原因是内核的Makefile维护的非常好的同时内核本身是一个完全自包含的项目,它对外界的依赖非常小(几乎所有的功能和函数库都在项目内部实现),因此只要产生正确的compile_commands.json就几乎可以实现100%准确的跳转等能力。

不过除了内核,日常工作中接触更多的还是业务层相关的项目,作为一个嵌入式从业人员,99%的时间在和交叉编译链打交道。clangd配合PC环境的GCC项目基本上不怎么需要配置就可以表现的比较完美了,但什么事情到了混乱的嵌入式领导都变得更加折腾,clangd也不例外。clangd用于交叉编译项目的时候一个明显的问题就是在默认配置下由于clangd不知道交叉编译链的位置, 因此也无法准确的知道编译器自带的系统头文件位置,此时默认的动作是将/usr/include等GCC默认系统头文件路径作为搜索路径,带来问题有两个:一是源码文件中include的.h文件跳转不准确,二是由于系统头文件的定义差异,导致源码中很多地方的变量等定义都可能解析失败,最终导致在稍微复杂点的项目中局部变量定义都可能跳转异常,这谁能忍!

目前解决该问题最简单的方法是通过给clangd传递–query-driver 启动参数来通知clangd交叉编译器的位置,clangd在启动时会利用传递的交叉便器参数自动解析出交叉编译链中所有系统头文件的路径(解析原理稍后分析)并自动玩过编译惨数的修改。

VScode中实现项目级–query-driver参数的传递可以通过在项目根目录的 “.vscode/settings.json” 文件添加实现,配置类似如下:

{
   
    "clangd.arguments": [
        "--all-scopes-completion",
        "--completion-style=detailed",
        "--query-driver=/home/boddy/t7linux-auto/ext-toolchain/bin/arm-linux-gnueabi*"
    
  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
在使用VSCode的过程,如果遇到了关于Clangd和头文件的问题,可以参考以下解决方案。首先,根据引用\[1\]的建议,在用户配置文件添加以下配置:"clang.diagnostic.enable": false。这样可以解决Clang插件的问题,但需要注意的是,这个解决方案只适用于Codecpp插件,因为Codecpp依赖于Clang。\[1\] 另外,根据引用\[2\]的描述,当使用Clangd进行交叉编译项目时,可能会遇到一些问题。默认情况下,Clangd无法准确知道交叉编译链的位置和编译器自带的系统头文件位置。为了解决这个问题,可以尝试手动配置Clangd的搜索路径,将交叉编译链的位置和系统头文件的位置添加到搜索路径。这样可以确保源码文件头文件跳转准确,并避免变量定义解析失败的问题。\[2\] 最后,根据引用\[3\]的说明,可以使用gen_sys_inc.sh脚本来自动生成.clangd文件,这样可以统一配置vimVSCode之间的差异。这个脚本可以帮助配置项目的额外设置,包括头文件路径等。\[3\] 综上所述,如果在使用VSCode的过程遇到了Clangd和头文件的问题,可以尝试以上的解决方案,包括禁用Clang插件、手动配置Clangd的搜索路径以及使用gen_sys_inc.sh脚本来生成配置文件。这样可以提高头文件的准确性和代码跳转的效果。 #### 引用[.reference_title] - *1* [vscode头文件红线,编译正常](https://blog.csdn.net/john19872308/article/details/122967962)[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^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vscode/vim+clangd 环境实现正确索引交叉编译链中系统头文件路径](https://blog.csdn.net/pangchol/article/details/123272252)[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^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值