之前我一直使用
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 下载安装包
安装后查看 clangd 版本
在 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,官方资料如下
Add: [-I, "/usr/include"]
是为了解决找不到标准库头文件的问题
Remove 是为了解决如下错误
至此,使用 clangd 的嵌入式 Linux 开发环境配置完成
参考
bear工具使用:ERROR: ld.so: object ‘/usr/${LIB}/bear/libear.so‘ from LD_PRELOAD