【问题标题】:Configure .ccls file for Vim为 Vim 配置 .ccls 文件
【发布时间】:2020-08-21 18:43:25
【问题描述】:

我不知道我在做什么。我决定使用 Vim 作为我唯一的编辑器,我正在尝试设置自动完成和语法检查。

所以我需要在我的项目的根目录中配置一个.ccls 文件(我不想生成一个compile_commands.json 文件所以请不要告诉我)。但是.ccls 上没有任何详细的文档,因为它所做的只是使用编译器标志,我当然不知道;我不久前开始使用 C++ 并且我不知道任何 CMake,我习惯于从 IDE 运行我的代码!

我知道要放入我的.ccls 的默认代码是我包含的路径,我确实放置了它(这是我使用clang++ -E -x c++ - -v < /dev/null 获得的 5 条路径),顺便说一句,我在 mac 上。我放了这些,我得到了自动补全,但是我的源代码中断了,因为错误告诉我 iostream 和 /usr/local/include 中不存在所有其他标头,即使我提供了 4 个其他路径(它真的没有退出 /usr/local/include 我不'不知道 iostream 和其他人在哪里)并且我不能 cout << "Hello, World!" << endl 例如因为 ostream 和 char[] 不兼容等等。顺便说一句,即使我使用 compile_commands.json 我仍然会收到错误,它只会修复我的标题路径。

谁能解释一下如何使用.ccls?没有链接,只是简单的解释。或者至少是一个默认配置让我继续前进。

P.S 我还需要提供项目头文件的路径吗?

这是我的.ccls

clang++
%cxx -std=c++17
%cxx -stdlib=libc++
%hxx --include=Global.h
%cxx -I/usr/local/include
%cxx -I/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1
%cxx -I/Library/Developer/CommandLineTools/usr/lib/clang/12.0.0/include
%cxx -I/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include
%cxx -I/Library/Developer/CommandLineTools/usr/include

【问题讨论】:

  • clang++ -E -x c++ - -v < /dev/null返回的路径是什么?
  • /usr/local/include - /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1 - /Library/Developer/CommandLineTools/usr/lib/clang/12.0. 0/include - /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include - /Library/Developer/CommandLineTools/usr/include
  • 我认为这并不重要,例如,为什么 ccls 告诉我 ostream 和 char[] 不兼容?我认为这是因为它需要模板实现但找不到它。尽管如此,我还是无法解决任何问题。开始考虑改用 VSCode。
  • iostream 应该在 /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1 之下图书馆。其他头文件将需要其他目录。
  • 重读你的问题和cmets后,不知道C++文件是否正确。它编译吗?它发现ostreamchar[] 不兼容的事实确实很奇怪。

标签: c++ vim compiler-errors linker


【解决方案1】:

我可能错了,但我会保持简单,只需将这些行放在.ccls 文件中

clang
-std=c++17
-stdlib=libc++
-isystem/usr/local/include
-isystem/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1
-isystem/Library/Developer/CommandLineTools/usr/lib/clang/12.0.0/include
-isystem/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include
-isystem/Library/Developer/CommandLineTools/usr/include

如果它一开始可以使用,那么您可以在所有这些行前面加上 %cxx %c -- 好吧,-std=c++17-stdlib=libc++..../include/c++/v1 仅适用于 C++。

顺便说一句,我不确定第一行是clang 还是clang++

注意:我使用 -isystem 的原因如下:

您可以使用 -I 覆盖系统头文件,替换为您自己的版本,因为在标准系统头文件目录之前搜索这些目录。 但是,您不应使用此选项添加包含供应商提供的系统头文件的目录;为此使用 -isystem。 -- https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

【讨论】:

  • 感谢您花时间提供帮助!不幸的是,它仍然无法正常工作。您的实现可能是正确的,但我想这是我的设置。我下载了 libc++ 并将其存储在我计算机上的某个位置,但我会让 Clang 在 Apple 的开发者工具 Clang 上运行,我只会将此构建用作我的 .ccls 的路径。我猜这一定行得通,因为真的没有其他理由不应该这样做。再次感谢您的帮助!
  • 最后一声求救;我将如何让 compile_commands.json 工作?它似乎完成了所有繁重的工作,但我仍然遇到一些小错误,比如“ostream 与 char[] 不兼容”错误。我正在使用“cmake -H. -BDebug -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=YES”生成 compile_commands.json 文件,而我的 CMakeLists.txt 文件只包含可执行文件的标准数据。我一直很痛苦,但非常感谢您的帮助! :)
  • 除非打包完成奇怪你应该已经有了libc++,它在include/c++/v1中。现在......我没有使用 Mac,我希望我不会浪费你的时间。关于-DCMAKE_EXPORT_COMPILE_COMMANDS=ON,需要一次,然后它会出现在编译目录中。简单的方法是在源目录中的这个文件上有一个符号链接。您可能需要将 clang 替换为 %compile_command IIRC。
  • 现在,有些事情从一开始就一直困扰着我。为什么你的错误信息是关于ostream 而不是std::ostream?是因为 ccls 简化了消息吗?或者你犯了初学者的罪,在头文件中有using namespace std;?由于您到目前为止没有任何-Iproject/paths 工作,它确实可以解释您所观察到的内容。
  • 老实说,我是在浪费你的时间,我应该感谢你。不,我确实不是“使用命名空间标准”。确保不习惯它。它也一直困扰着我。我可以“std::cout”小数点很好,但我不能打印其他任何东西。而且我也不能使用“std::endl”,它会问我是否打算使用它的实现。就像它使用指定的实现而不是模板一样,我通常在使用模板而不包括“.cxx”文件中的实现时遇到这些错误
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多