ccls是从cquery派生出来的一个款C++的LSP Server。本文讲述如何在Windows下编译它。注意,所用Window版本为Win10。
ccls和cquery不同的地方在于,ccls是基于libLLVM的,而cquery是基于libclang的,所以ccls可以从C/C++源文件中解析出更多信息,但是导致它依赖于libLLVM,使得编译过程更加复杂。
官方编译教程在:https://github.com/MaskRay/ccls/wiki/Build
本文假设64位编译。
准备工作
安装带有libLLVM的Clang/LLVM
可以从 Building-Zig-on-Windows下载使用MSVC编译的7.0.0版本的Clang/LLVM包。之后解压缩到目录C:/Program Files/llvm+clang-7.0.0-win64-msvc-release
。
注意,因为下载的Clang/LLVM是用MSVC编译的,所以也必须用MSVC来编译ccls
安装Visual Studio
可以安装Visual Studio 2017的Community版本或者Express版本。
编译需要用到Visual Studio的命令行,可以用下面的方式开启:
- 对于Visual Studio Community,在开始菜单里面打开
x64 Native Tools Command Prompt for VS 2017
- 对于Visual Studio Express,因为其工具链是32位的,菜单里面的
x64 Native Tools Command Prompt for VS 2017
会出错,需要使用x86_x64 Cross Tools Command Prompt for VS 2017
,或者在cmd.exe里面执行C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\VC\Auxiliary\Build\vcvarsall.bat x86_amd64
。
在命令行中输入cl
,会输出以下信息
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27026.1 for x64
确保最后是for x64的。
安装相关的库
编译需要用到ncurse和jq等第三方库,可以从msys2获取。
安装msys2好之后(安装路径在C:/msys64/mingw64/
),在打开的命令行中输入以下命令:
pacman -S mingw-w64-x86_64-jq mingw-w64-x86_64-ncurses
cmake和ninja
安装cmake和ninja,确保这两者的路径在环境变量PATH中。
可以用chocolatey或者scoop来安装这两个程序
编译过程
按照上面介绍的方法打开Visual Studio的命令行,用git从ccls将源代码克隆下来,然后执行以下命令:
# 进到ccls源代码目录
cd ccls
mkdir build
cd build
# 生成编译文件
cmake .. -DCMAKE_BUILD_TYPE=Release -DSYSTEM_CLANG=ON -DCMAKE_CXX_STANDARD=17 -G "Ninja" -DCMAKE_PREFIX_PATH="C:/llvm+clang-7.0.0-win64-msvc-release/;C:/msys64/mingw64/" -DCMAKE_CXX_COMPILER="C:/llvm+clang-7.0.0-win64-msvc-release/bin/clang-cl.exe"
# 执行编译
cmake --build .
一些注解:
- -DCMAKE_CXX_STANDARD=17,开启C++17标准
- -DCMAKE_BUILD_TYPE=Release,编译Release版本,否则链接不过
- -DSYSTEM_CLANG=ON,采用系统中的clang,而不是去下载
- -G “Ninja”, 生成Ninja的构建文件
- -DCMAKE_PREFIX_PATH=“C:/llvm+clang-7.0.0-win64-msvc-release/;C:/msys64/mingw64/",指定CMake的搜索路径,需要添加Clang/LLVM和Msys的库,注意路径中的目录要用
\
分割,不同的路径用;
分割。 - -DCMAKE_CXX_COMPILER=“C:/llvm+clang-7.0.0-win64-msvc-release/bin/clang-cl.exe”,使用
clang-cl
作为编译器。
大功告成!
其他参考
- https://github.com/MaskRay/ccls/wiki/Getting-started
- 如果出现
error: expected ‘)’ before ‘PRIu64’
的错误,则需要使用CMake选项-DCMAKE_CXX_FLAGS=-D__STDC_FORMAT_MACROS
(完)
2019-11-25更新
到https://github.com/ziglang/zig/wiki/Building-Zig-on-Windows下载
- llvm+clang-9.0.0-win64-msvc-mt.tar.xz (417 MiB) (sha256 660ceaec19740b0fda8dea028bb609edb9a4fd4cd3fc435b383fa8e4e7926db5)
使用MSVC静态编译,打开x64 Native Tools Command Prompt for VS 2019:
cmake -H. -BRelease -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="C:\llvm+clang-9.0.0-win64-msvc-mt" -DCMAKE_CXX_FLAGS_RELEASE="/MT"
ninja -C Release
- LNK2038: mismatch detected for ‘RuntimeLibrary’: value ‘MT_StaticRelease’ doesn’t match value ‘MD_DynamicRelease’ in file.obj
- Compile with /MT instead of /MD using CMake
(更新完)