笑看天下无敌手 发表于 2024-10-23 06:27:21

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

之前我一直使用
VSCode + C/C++ + Remote - SSH
举行嵌入式 Linux 驱动开辟学习
但经常找不到头文件,主动补全也几乎不可用
https://i-blog.csdnimg.cn/blog_migrate/d12f5e39440c7fe9abe4ac194945565f.png
在网上查找许多帖子后,学习使用了
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 是否安装成功
https://i-blog.csdnimg.cn/blog_migrate/c0cb179f373e5126c57d663f927a810e.png
Bear 的使用

https://i-blog.csdnimg.cn/blog_migrate/da2a965b2a1bf830fc2efbad0bcda463.png
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 错误
https://i-blog.csdnimg.cn/blog_migrate/09fd834cc6706184ed628c7697f1d10e.png
办理方案

检查 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 文件
https://i-blog.csdnimg.cn/blog_migrate/6da138ab414a7a41997c3e9a4b295290.png
须要将 “cc” 全局更换为 “arm-buildroot-linux-gnueabihf-gcc”
在 vim 中输入如下命令
:%s/"cc"/"arm-buildroot-linux-gnueabihf-gcc"/g
https://i-blog.csdnimg.cn/blog_migrate/3250ef59128d609f52f8beb95370ed1a.png
不更换的话会报这个错
https://i-blog.csdnimg.cn/blog_migrate/fea5aae8bfb03d1c31f2269f2ddc61e2.png
Unsupported option ‘-mabi=’ for target ‘x86_64-unknown-linux-gnu’
clangd

在 Linux 上安装 clangd

执行命令 sudo apt-get install clangd 后显示无法定位软件包
https://i-blog.csdnimg.cn/blog_migrate/e5dd84fe209636b0ba0ae2cd4d5bd640.png
查看资料发现
我的 Ubuntu 版本是 18.04.6
默认的 clangd 版本非常老 (安装命令都不一样)
https://i-blog.csdnimg.cn/blog_migrate/6f053860374a5cb699cfaf125bb75b90.png
https://i-blog.csdnimg.cn/blog_migrate/52794c3ef7e5b6cd7725744566598feb.png
手工安装 clangd

从官网 https://github.com/clangd/clangd/releases 下载安装包
https://i-blog.csdnimg.cn/blog_migrate/96cad8d78bf2e1fa96563701fb5752fa.png
将安装包中的 bin 和 lib 拷贝至 /usr 目录下
安装后查看 clangd 版本
https://i-blog.csdnimg.cn/blog_migrate/e473b99db2e7989e7c39e527a7036f6b.png
在 VSCode 上配置 clangd

settings.json

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

创建 .clangd 文件,把它放在工程目录下
我的 .clangd 文件内容如下
CompileFlags:
    Add:
      [-I, "/usr/include"]
    Remove:
      [
            -fconserve-stack,
            -fno-ipa-sra,
            -fno-var-tracking-assignments
      ]
关于 CompileFlags,官方资料如下
https://i-blog.csdnimg.cn/blog_migrate/6d6b49dd84c9afd7a23743e09f424a20.png
Add: [-I, "/usr/include"]
是为了办理找不到尺度库头文件的问题
https://img-blog.csdnimg.cn/direct/93ba1d77c12f42f986b24c269cb5ef31.png
Remove 是为了办理如下错误
https://i-blog.csdnimg.cn/blog_migrate/56f49a983a6485c40ce5999f447dcd70.png
至此,使用 clangd 的嵌入式 Linux 开辟环境配置完成
参考

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Vscode + Clangd 配置嵌入式 Linux 开辟环境