前言
最近使用 C/C++
开发,在 Emacs
下使用 cmake
作为编译工具,结合 ccls
进行代码补全,有着不错的体验,于是记录一下。
ccls 介绍
ccls
是基于cquery[1]的 C/C++/Objective-C
的代码补全的工具,它实现了 C/C++/Objective-C
的Language Server Protocol[2]的服务端。支持代码补全,代码的引用查找和跳转,有着良好的体验。
我使用 ccls
是由于它能支持 lsp
,可以在 Emacs
中使用。当然也是支持 Atom
、 Vim
、 VSCode
等编辑器的。
安装ccls
Mac
在 mac
下安装 ccls
使用 brew install ccls
十分的方便,但是这个版本还停留在 0.20190823.6
实在是太老旧了。使用过程中发现并不能很好的工作,建议采用源码编译。
编译过程如下
cmake &llvm
ccls
的编译需要 cmake
和 llvm
,所以在编译之前需要安装 cmake
和 llvm
。
brew install cmake llvm
使用 brew
安装的 llvm
路径在 /usr/local/Cellar/llvm/10.0.1
,编译 ccls
会用到。
编译ccls
git clone --depth=1 --recursive https://github.com/MaskRay/ccls
cd ccls
cmake -H. -BRelease -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/usr/local/Cellar/llvm/10.0.1/lib/cmake -DUSE_SYSTEM_RAPIDJSON=off
cmake --build Release --target install
ccls
会被安装到 /usr/local/bin/ccls
。
其中 -DCMAKE_PREFIX_PATH
需要换成你的 llvm
的安装路径。
这样 ccls
就编译好了。
Linux
我所使用的 Linux
发行版是 Manjaro
,所以安装起来就非常方便了。
sudo pacman -S ccls-git
命令执行完,也就安装好了,非常省事。
其它 Linux
发现版,可以参考 Build · MaskRay/ccls Wiki[3]
为项目配置 ccls 补全
当我们装好 ccls
后,就可以使用 Emacs
结合 lsp
打开 C/C++
的项目,在项目的根目录下就会生成 .ccls-cache
的文件夹。这就表示当前项目被 ccls
识别了。
做完上面之后,我们打开文件,会发现许多文件都会找不到头文件,补全也不完整,甚至连 iostream
都找不到,这就很纳闷了。
我的 C/C++
项目采用的是 cmake
作为编译工具,所以在查找官网资料后,发现只要在使用 cmake
的时候加上 -DCMAKE_EXPORT_COMPILE_COMMANDS=On
,然后把 compile_commands.json
放到根目录就行。具体操作如下
mkdir build && cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On ..
cd ..
ln -s build/compile_commands.json
-DCMAKE_EXPORT_COMPILE_COMMANDS
会告诉 cmake
把编译的指令都导出到 compile_commands.json
中,当 ccls
解析 compile_commands.json
后就知道源码在哪里了,知道去哪里找头文件等等。
除了在命令行加上 -DCMAKE_EXPORT_COMPILE_COMMANDS
参数外,还可以在 cmake
中设置,这样就可以避免每次编译都要输入,或者忘记。
set(EXPORT_COMPILE_COMMANDS ON)
如果你不是使用 cmake
作为编译工具可以参考 Project Setup · MaskRay/ccls Wiki[4]
参考资料
[1]cquery: https://github.com/jacobdufault/cquery
[2]Language Server Protocol: https://langserver.org/
[3]Build · MaskRay/ccls Wiki: https://github.com/MaskRay/ccls/wiki/Build
[4]Project Setup · MaskRay/ccls Wiki: https://github.com/MaskRay/ccls/wiki/Project-Setup
往期推荐