为什么YouCompleteMe在点后不起作用?

时间:2016-01-22 21:56:31

标签: c++ vim clang youcompleteme clang-cl

我已根据安装指南安装了 YouCompleteMe 。我在 Windows 计算机上使用 gVim 。基本的符号完成工作正常,但我无法从标题中自动完成。

如果我有:

#include <vector>
using namespace std;
vector<int> myVector;

然后找不到myVector.<smth like push_back etc...>

的完成情况

Vim状态栏说:

--User defined completion (^U^N^P) Pattern not found

--Omni completion (^O^N^P) Pattern not found

诊断

我开始诊断问题了。 :YcmDiags命令提供来自头文件的错误列表。由于 YouCompleteMe 使用 clang 来不断编译源代码,我尝试使用clang编译我的文件。我也知道我应该在 .ycm_extra_conf.py 的标志中为clang指定命令行选项。我不知道YCM是运行 clang.exe 还是 clang-cl.exe ,但实际上我使用 clang-cl成功编译了我的.cpp文件。从命令行运行 vsvars32.bat 后手动执行。我没有使用 clang.exe 成功编译。

这是我的 .ycm_extra_conf.py 文件标记部分:

flags = [ 
'-std=c++11',
'-x', 'c++',
'-I', 'C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include',
'-I', 'C:/Program Files (x86)/Windows Kits/10/Include/10.0.10150.0/ucrt',
'-I', 'C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/atlmfc/include',
'-I', 'C:/Program Files (x86)/Windows Kits/NETFXSDK/4.6/include/um',
'-I', 'C:/Program Files (x86)/Windows Kits/8.1/Include/um',
'-I', 'C:/Program Files (x86)/Windows Kits/8.1/Include/shared',
'-I', 'C:/Program Files (x86)/Windows Kits/8.1/Include/winrt',
'/link', '/LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib" /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\lib" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.10150.0\ucrt\x86" /LIBPATH:"C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86"',
'/EHsc']

2 个答案:

答案 0 :(得分:0)

micbou 给了我answer这个问题。

  

在Windows上,Clang在32位上使用i686-pc-windows-gnu,在64位上使用x86_64-w64-windows-gnu作为其默认目标。您需要通过添加以下标志将其更改为MSVC:

     

flags = [ '--target=<arch>-pc-windows-msvc<xx.yy.zzzzz>' ]   32位为i686,64位为x86_64<xx.yy.zzzzz>为MSVC的版本。您可以通过运行VC ++编译器cl.exe找到它。在您的情况下,由于您在32位上使用MSVC 14,因此目标应为i686-pc-windows-msvc19.00.23506

     

使用已添加的包含标记,您应该从标题中获得完成。

在我的特定情况下,--target=x86_64-pc-windows-msvc19.00.23026标志解决了问题。

答案 1 :(得分:0)

这与YCM无关,只是回答普通的方法。

我通常在linux上做的是扩展path以包括std库头,如:

set path+=/usr/include/**

然后,我们可以使用 Ctrl - p Ctrl - n