首页 > 系统相关 >在CentOS7等老系统上配置clangd进行C/C++开发

在CentOS7等老系统上配置clangd进行C/C++开发

时间:2023-12-11 21:55:22浏览次数:45  
标签:clangd 头文件 glibc 2.18 C++ CentOS7 16.0 home

应该有许多公司开发机器上还是用着比较老的环境,比如CentOS7之类的。这类系统上很可能他的glibc的版本不到2.18,clangd要求的最低glibc版本就是2.18,因此我们没办法直接在这类老系统上运行clangd。
但是vscode上微软的那个c++插件一坨史,慢不说,补全也差劲。

我的要求有几点:

  1. 不能升级内核的glibc版本,因为这可能导致许多服务出现错误,而且这是公司机器更加不敢乱折腾。
  2. 不安装clang,头文件等基于CentOS下的gcc4.5.8。
  3. 安装在用户目录下,不需要root。

折腾了许久,终于搞出了一个能用的方案。

手动编译glibc2.18

首先clangd本身除了对glibc版本大于2.18之外,没有别的要求,所以我们可以在用户目录下编译一个只供运行clangd的glibc,这样就不需要升级内核的glibc版本。

wget https://mirrors.tuna.tsinghua.edu.cn/gnu/glibc/glibc-2.18.tar.gz
tar -zxvf glibc-2.18.tar.gz
cd glibc-2.18
mkdir build
cd build
../configure --prefix=/home/用户名/myglibc
make -j 8
make install

注意,在../configure的过程中,可能会失败,原因可能有缺少依赖比如autoconf之类的,缺什么我们就装什么即可。如果提示LD_LIBRARY_PATH包含当前目录的错误,我们只需要在当前终端用命令export LD_LIBRARY_PATH=即可,这个命令的效果在关闭终端后就消失,因此无须担心。而且我们只需要编译完成之后就再也不需要输入这个命令。

下载已经编译好的clangd

可以在https://github.com/clangd/clangd/releases/tag/16.0.2此处下载已经编译好的clangd。

wget https://github.com/clangd/clangd/releases/download/16.0.2/clangd-linux-16.0.2.zip
unzip clangd-linux-16.0.2.zip
cd clangd_16.0.2/bin
# 尝试用刚刚编译出来的glibc运行这个clangd
/home/用户名/myglibc/lib/ld-2.18.so /home/用户名/clangd_16.0.2/bin/clangd

如果运行成功没问题,那这一步就成功了。

编写运行clangd的脚本

但是此时就算前台能够成功运行LSP,vscode-clangd也是没办法找到LSP的进程的。我们需要在vscode的settings.json中配置clangd.path这一项才行。
但是我们的clangd没办法直接运行,如果你直接./clangd,还是会报错/lib64/libc.so.6: version GLIBC_2.18' not found`。所以我们可以用一个迂回的办法,写一个脚本,把这个脚本伪装成clangd,然后在clangd.path中填上该脚本的路径即可。

cd clangd_16.0.2/bin
vim start_clangd.sh
#在文件中加入以下这行内容
/home/用户名/myglibc/lib/ld-2.18.so /home/用户名/clangd_16.0.2/bin/clangd $@
#退出vim,赋予该脚本执行权限
chmod +x start_clangd.sh

尝试运行一下脚本,看看是否能成功执行clangd,sh start_clangd.sh,能成功执行就没问题。

接下来到vscode的settings.json中,加入这一项:"clangd.path" : "/home/用户名/clangd_16.0.2/bin/start_clangd.sh"

接下来ctrl + shift + preload window重新加载一下vscode,就会发现vscode能够与LSP建立通信了,vscode-clangd可以work。

(可选)配置clangd

有可能clangd正常运行后,出现了头文件找不到之类的异常。我在这里总结一下我遇到的几个找不到头文件的异常。

C++的头文件找不到

这个问题主要是我们没有给clangd配置使用gcc的库,我们需要在vscode的settings.json中加入这一项即可:

"clangd.arguments" : [
	"--query-driver=/usr/bin/g++"
]

诸如stdarg.h之类的头文件找不到

查看了clangd的官方文档后,可以知道,由于这些头文件与parser的关系过于密切,所以和clangd绑定了,这些路径的目录是写死的,是../lib/xxx。这里是相对路径形式给出的,经过测试,用本文的方法,会以ld-2.18.so会起点算相对路径。所以我们先去clangd的文件夹把这些头文件拷贝出来。

cd /home/用户名/clangd_16.0.2
cp -r ./lib /home/用户名/myglibc

这样的话,到时候clangd就会去路径/home/用户名/myglibc/lib/../lib找头文件,就能正确找到那些头文件了。

基于makefile生成compile_commands.json

有可能接触的项目并没有使用CMake,但是clangd需要compile_commands.json的数据才能提供补全和索引等功能。
此时可以考虑使用bear(在CentOS上同样需要手动编译老版本),所以这里更推荐使用compiledb。

compiledb只需要有pip就可以安装,一般环境上都有Python和pip,没有的话包管理工具也能很方便装上。在使用pip install compiledb即可了。
compiledb就可以很方便的生成compile_commands.json给clangd使用。至此,就在老系统上拥有了一个相对现代化的C/C++开发环境。

标签:clangd,头文件,glibc,2.18,C++,CentOS7,16.0,home
From: https://www.cnblogs.com/st0rmKR/p/17895662.html

相关文章

  • C++学习笔记七:输出格式
    这一篇主要总结一下C++标准库里输出格式相关的库函数。https://en.cppreference.com/w/cpp/io/manip1.库:<ostream><ios><iomanip> 2.库函数:2.1<ostream>std::endl:输出换行,同"\n"的效果一样。std::flush:causesimmediatesendingofdatatothedeviceconnecte......
  • visual Studio 2022 C++ 配置PCL库
    理论上来说,配置过程跟其他库没有什么区别,可以参考如下几篇博文1. https://blog.csdn.net/yellow_hill/article/details/1264586922. https://blog.csdn.net/syz201558503103/article/details/103892364但有个比较坑的一个点是:由于PCL第三方库的debug和Release文件都放置在一......
  • C++(std::unique_ptr)
    std::unique_ptr是C++标准库中的一种智能指针,用于管理动态分配的内存。它是一种独占拥有权(exclusiveownership)的智能指针,保证同一时刻只有一个std::unique_ptr指向特定的资源。当std::unique_ptr被销毁时,它所拥有的资源也会被释放。以下是std::unique_ptr的基本用法和......
  • 超算集群安装OpenFOAM-LIGGGHTS-CFDEM(普通用户权限-以CSU HPC CentOS7.9为例)
    普通用户权限超算集群安装OpenFOAM-LIGGGHTS-CFDEM,由于缺少root权限,无法根据CFDEM官方instruction进行安装。本文以CSU超算平台为例,利用普通用户权限进行编译安装。文章修正了已有教程中部分问题,特别感谢希望先生与记得小蘋初见教程。1.安装必要依赖包此部分在记得小蘋初见中......
  • Python和C++之间
    编程语言编程语言创造来都是为了解决实际问题的了解一门第二,甚至第三语言。因为只有你了解了不同工具的特性,以及它们擅长解决的问题,你才能更高效地在日常工作中运用它们。为问题选择正确的语言/工具/解决方案,将能大大减少解决问题所需的工作量训练你习惯跳出一种语言或范式的......
  • C++学习笔记六:运算符(五种基本运算操作,优先级和结合性)
    这一章对操作符进行简单的总结:1.五种基本运算类型:加减乘除,取余add,substract,multiply,divide,modulusintnumber1{2};intnumber2{7};intresult=number1+number2;result=number2-number1;result=number1-number2;result=number1*number2;result=......
  • C++ Qt开发:PushButton按钮组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QPushButton按钮组件的常用方法及灵活运用。QPushButton是Qt框架中用于创建按钮的组件类,是QW......
  • C++U4-第08课-队列
    队列:顺序队列 队列基本操作 选择题1 选择题2 程序阅读题     打疫苗 【算法分析】用数组实现队列,按题意模拟即可。【参考代码】#include<iostream>usingnamespacestd;stringq[1010];intf,r;//f前端,指向队头,r后端,指向队尾的后......
  • C++U5-09-二叉树2
    二叉树(二)二叉树遍历是一种重要的操作,它在许多应用场景中被广泛使用。以下是一些常见的应用场景:查找和搜索:二叉树遍历可以用于查找特定元素或者进行搜索操作。通过遍历整棵树,可以找到目标元素并进行相应的处理。例如,在二叉搜索树中查找某个特定值,或者在字典树中搜索以某个前缀......
  • C++U3-第4课-结构体应用
    上节课作业分析讲解:链接:https://pan.baidu.com/s/15b4fJq1Xxd2X6uB9CJuVXw?pwd=r9nt提取码:r9nt结构体应用 sort排序函数回顾 结构体排序结构体排序,排序的时候给cmp函数传递的是新创建的结构体类型,所以函数里形参类型就是结构体的类型 例题1#include<iostream>......