索引建立了,我上面忘了写。。。
.cquery 里面的选项对吗?
用 bear make
生成配置文件试试。
由于个人编程习惯不好。。。所以现在不具备make的条件。。。bear make编译不了。。。我甚至连makefile都还没有。。。
沒有compile_commands.json
.cquery或.ccls
,很容易不帶開關編譯(像這樣:clang++ a.cc
),對於boost檢索不了很正常
bear make -k
,不一定需要編譯通過,能運行編譯命令就好。
现在使用了CMake管理工程, 并通过CMake的CMAKE_EXPORT_COMPILE_COMMANDS
生成了compile_commands.json
文件. 工程可以正确编译, 并且没有warning, 但是在emacs里依然存在上述问题…
会不会跟 compile_commands.json 文件应该放在哪里有关?
比如工程是这样编译的:
$ mkdir build && cd build
$ cmake ../src
......
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ../src
生成的 compile_commands.json 文件也在 build/
,不在项目根目录,所以其实没有起作用?
应该不是找不到compile_commands.json文件的原因:
- 我的compile_commands.json文件确实是在build目录下, 但是我再根目录建立了连接, 我看其他有些项目也是这样做的.
- 并不是所有语法解析都不正确, 很多其他的语法解析和自动补全都还是正常的. 其实总结一下问题, 目前我发现的主要是两个, 一个是boost类里面有些构造函数解析不太正常, 如主题中的例子; 另一个是有些类找不到合适的定义, 比如最近又遇到了
boost::asio::serial_port
和boost::unordered_map
被认为是int型的问题. 其他一些东西, 比如boost::shared_ptr
和boost::container::deque
是可以正常解析的.
PS: 我的boost是安装在系统里的, 路径在/usr/local
下面. 不知道语法解析会需要对这个做特殊配置, 但是自动补全是没有问题的.
github上有的話你把鏈接發給我。
最好给个完整的、可构建的例子代码,像这样 GitHub - tomergafner/cmake-boost-boilerplate-template: A boilerplate template to quickly create a c++ project with boost
这里 是我临时写的一个可以编译运行的工程. 会出现前面我提到的问题. 工程下面的compile_commands.json
是一个指向 build 文件夹中内容的一个软连接, 可能需要根据实际情况调整.
再次说明一下: 我的这个工程需要环境安装了 boost 库, 我自己是用的默认的安装方式, 再路径/usr/local
下面. 个人感觉 cquery 还是找到了这个位置, 因为很多 boost 库里定义的补全都是可以自动找到的.
这个是在我的机器上的效果, 双显示器不太会处理截图…
Debian libboost-all-dev
boost::asio::io_device <point>io
boost::<point>bind
等位置都能跳轉。
可能是因爲你的boost path components裏有幾個..
的。在Arch Linux還能觀察到#include <string>
等都無法檢索,可以觀察到clang++ -xc++ /dev/null -E -v
返回的include path 中..
太多了。
我很久以前給libclang加了clang_File_tryGetRealPathName
,ccls
用了。
不好意思, 由于我对细节不太了解, 有点没太看懂您的解释. 我可以简单理解为:
- 这个问题我在不触碰cquery源码的情况下不能自己解决了吗?
- ccls可以正确解析不会有这个问题是吗?
你添加-isystem/usr/include
到.cquery
試試。或其他包含boost的目錄名。
ccls只有用clang>7才有clang_File_tryGetRealPathName
。這也只是我的一個猜測。
是否.cquery
文件存在后, compile_commands.json
就不起做用了? 还是两个同时能起作用, .cquery
优先级高些?
试了你给的测试代码,发现我之前 #11 楼贴的图是有问题的:
- 没开启 cquery/ccls。
- 补全是 company-clang 提供的。
如果不开启 cquery/ccls,我打开 BoostTester.hpp 也会看到 2 处错误(数字可能跟 company-clang 版本有关),错误信息应该也是 comany-clang 给 flycheck 的:
company-clang 提供的信息可能有点过时。开启 cquery/ccls 之后,flyckeck 就收到正确的信息了,没有错误(注意 mode-line 颜色,红色表示有错误),光标下的函数信息都有提示(底部 minibuffer 和 右侧 tooltip 浮动窗口):
我看你的图,也只有 flycheck 下划波浪线提示。检查你打开 hpp 文件的时候是否自动启动了 cquery/ccls:
⋊> pgrep -fl cquery
71685 /usr/local/bin/cquery
发现一个真正的 cqueyr/ccls 两者都有的问题,总是提示找不到当前正在编辑的文件 BoostTester.hpp:
步骤:
- 克隆 #12 楼的代码
cd boost_test && mkdir build && cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..
- Emacs 打开 BoostTester.hpp 文件
- 观察 Minibuffer /
*Messages*
我觉得我的情况和您不一样, 其实你仔细看我的图片, 会发现flycheck的错误提示前面都有cquery:***
, 这让我觉得我这里的错误确实是cquery报出来的. 至于版本, 由于我是不升级不舒服司机, 所以不敢说最新, 但是cquery, spacemacs和其他的melpa包都应该是比较新的, 而且这个问题出现有比较长的时间了, 几次更新都没有什么改善, 所幸没有遇到新的问题…
发现一个真正的 cqueyr/ccls 两者都有的问题,总是提示找不到当前正在编辑的文件 BoostTester.hpp:
hover(textDocument/hover
)在io.run()
上不能顯示:
std::size_t boost::asio::io_service::run()
?我這裏是好的。Unable to find file
通常是因爲一個檔案解析失敗了,--log-file
裏往往會有libclang
crash的字樣。
我發現一個真正的ccls的問題,.h
裏沒有diagnostics信息,可能在最新的commit Display diagnostics from header files
修復了。這裏的改動在於ccls不會直接索引.h
,而cquery會(如果.h
和.cc
不在同一目錄,clang command line推導錯誤會導致.h
中的索引信息丟失)
确实使用.cquery
文件是可以解决问题的, 我还是没太体会
的意思, 因为在我的boost装在/usr/local/include
, 而我的环境这个是系统路径, 不论是.cquery
还是compile_commands.json
文件中都没有与这个路径相关的信息.
不知道。和你說話太費勁了。OSS一開始就應該給專案鏈接。
确实使用.cquery文件是可以解决问题的
你貼上內容歧義會更少。
而我的环境这个是系统路径
不知道你在說什麼。
使用CMake生成的compile_commands.json作为索引.
直接給命令更清晰。
会报错no matching
如果能指出point位置,是lsp-ui-flycheck產生的信息會更好。
cquery預設initialization option是,cacheFormat: “json”,生成的.cquery/**/*.json
人類可讀,你看裏面的includes.resolved_path
就知道:不帶-isystem
使用compile_commands.json
時,路徑可能錯誤了。
抱歉一下,我前面回覆也是懶惰,自己想少打幾個字(一邊在幹別的事),雖然知道多說一點可以減少交互次數。
抱歉, 因为我主要是个使用者, 可能不太清楚提供哪些信息能够更好的帮助解决问题, 之前的信息有点散, 这里重新整理一下我这边的现状, 有些信息在前面的几条回复中会有重复:
- 我的环境是Ubuntu16.04, 我在我的环境中安装了boost1.58, 安装后的路径在
/usr/local
下面, 其中boost的头文件在/usr/local/include
下. 这个路径不需要显示的包含在CMakeLists.txt
和.cquery
中. -
这里是一个在我的环境下可以正常编译通过并运行的一个测试工程. 其中
CMakeLists.txt
的第8行有配置set (CMAKE_EXPORT_COMPILE_COMMANDS 1)
, 所以直接运行cmake .
会直接在目录下生成compile_commands.json
文件. 下图是当使用这个compile_commands.json
时, 在我机器上的效果:从图中应该可以看出错误是由cquery和lsp-ui产生的. - 生成的
compile_commands.json
中的内容如下:
[
{
"directory": "/home/allen/tmp/boost/build",
"command": "/usr/bin/c++ -std=gnu++11 -o CMakeFiles/boost_test.dir/main.cpp.o -c /home/allen/tmp/boost/main.cpp",
"file": "/home/allen/tmp/boost/main.cpp"
}
]
- 使用
.cquery
文件后, 再次查看上图中的文件, 就没有错误了, 对应的补全也可正确完成, 这里就不再贴图了. 其中我用的.cquery
文件只有如下内容:
%clang++
%cpp -std=gnu++11
-pthread
- 我分别查看了使用
compile_commands.json
和.cquery
时, 在.cquery_cached_index
下 的BoostTester.hpp.json
文件, 里面都包含了"-isystem /usr/local/include"
. - 不知是否还需要提供其他信息?