Vscode + Clangd 配置嵌入式 Linux 开辟环境

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718

之前我一直使用
VSCode + C/C++ + Remote - SSH
举行嵌入式 Linux 驱动开辟学习
但经常找不到头文件,主动补全也几乎不可用

在网上查找许多帖子后,学习使用了
VSCode + C/C++ + clangd + Remote - SSH
举行开辟
Bear

clangd 须要一个 compile_commands.json 文件才气精确剖析项目标编译选项和文件依赖
可以使用 Cmake 或 Bear 生成 compile_commands.json 文件
由于之前没有使用过 CMake,再加上学习 CMake 有肯定的本钱,所以我选择使用 Bear 工具来生成 compile_commands.json 文件
安装 Bear

sudo apt-get install bear
查看 Bear 是否安装成功

Bear 的使用


2.4.x 版本之前是在 build 命令前加上 bear 命令
bear <your-build-command>
2.4.x 版本之后是
bear -- <your-build-command>
使用 Bear 生成compile_commands.json

在 Linux 源码文件中使用 bear 命令生成compile_commands.json
ERROR: ld.so: object ‘/usr/${LIB}/bear/libear.so‘ from LD_PRELOAD

我的 Bear 版本是 2.3.11,没有主动设置 LD_PRELOAD 环境变量
编译时会产生 ld.so: object ‘/usr/${LIB}/bear/libear.so‘ from LD_PRELOAD 错误

办理方案

检查 libear.so 路径:
使用以下命令检查 libear.so 的实际路径
find /usr -name libear.so
然后使用 bear -l 指定路径
bear -l /实际路径/libear.so make
或者手动设置 LD_PRELOAD 再使用 bear 命令
export LD_PRELOAD=/实际路径/libear.so

设置交叉编译环境
然后执行命令 bear -l /usr/lib/x86_64-linux-gnu/bear/libear.so make -j4
命令执行结束后会在项目文件夹下生成 compile_commands.json 文件

须要将 “cc” 全局更换为 “arm-buildroot-linux-gnueabihf-gcc”
在 vim 中输入如下命令
:%s/"cc"/"arm-buildroot-linux-gnueabihf-gcc"/g

不更换的话会报这个错

Unsupported option ‘-mabi=’ for target ‘x86_64-unknown-linux-gnu’
clangd

在 Linux 上安装 clangd

执行命令 sudo apt-get install clangd 后显示无法定位软件包

查看资料发现
我的 Ubuntu 版本是 18.04.6
默认的 clangd 版本非常老 (安装命令都不一样)


手工安装 clangd

从官网 https://github.com/clangd/clangd/releases 下载安装包

将安装包中的 bin 和 lib 拷贝至 /usr 目录下
安装后查看 clangd 版本

在 VSCode 上配置 clangd

settings.json

在 VSCode 的配置文件中增加如下配置
  1.     "clangd.arguments": [
  2.         "--background-index",                   // 在后台自动分析文件(基于complie_commands)
  3.         "--compile-commands-dir=/home/yz/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2",   
  4.                                                 // compelie_commands.json文件的目录位置  
  5.         "-j=4",                                 // 同时开启的任务数量
  6.         "--query-driver=/usr/bin/gcc",          // 编译器的路径
  7.         "--clang-tidy",                         // clang-tidy 功能
  8.         "--clang-tidy-checks=performance-*,bugprone-*",
  9.         "--all-scopes-completion",              // 全局补全(会自动补充头文件)
  10.         "--completion-style=detailed",          // 更详细的补全内容
  11.         "--header-insertion=iwyu",              // 补充头文件的形式
  12.         "--pch-storage=disk",                   // pch 优化的位置
  13.     ],
  14.     "clangd.path": "/usr/bin/clangd",
  15.     "clangd.fallbackFlags": [
  16.         "-I/home/yz/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/include",
  17.         "-I/home/yz/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/arch/arm/include",
  18.         "-I/home/yz/workspace/kernel-driver/linux-xlnx-xlnx_rebase_v5.4_2020.2/arch/arm/include/generated/"
  19.     ]
复制代码
clangd.fallbackFlags 是 clangd 的配置选项之一,用于指定当无法从 compile_commands.json 文件中获取编译选项时要使用的备用编译选项
这里我配置的是 Linux 源码的函数头文件路径
.clangd

创建 .clangd 文件,把它放在工程目录下
我的 .clangd 文件内容如下
  1. CompileFlags:
  2.     Add:
  3.         [-I, "/usr/include"]
  4.     Remove:
  5.         [
  6.             -fconserve-stack,
  7.             -fno-ipa-sra,
  8.             -fno-var-tracking-assignments
  9.         ]
复制代码
关于 CompileFlags,官方资料如下

Add: [-I, "/usr/include"]
是为了办理找不到尺度库头文件的问题

Remove 是为了办理如下错误


至此,使用 clangd 的嵌入式 Linux 开辟环境配置完成
参考

C++开辟环境最佳实践
bear工具使用:ERROR: ld.so: object ‘/usr/${LIB}/bear/libear.so‘ from LD_PRELOAD
在Ubuntu中搭建嵌入式Linux开辟环境
最终,我看向了clangd

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表