之前我一直使用
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 的配置文件中增加如下配置
- "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 开辟环境配置完成
参考
C++开辟环境最佳实践
bear工具使用:ERROR: ld.so: object ‘/usr/${LIB}/bear/libear.so‘ from LD_PRELOAD
在Ubuntu中搭建嵌入式Linux开辟环境
最终,我看向了clangd
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |