我正在尝试运行Ale作为我的linter,而后者又使用clang-check来lint我的代码。
$ clang-check FeatureManager.h
Error while trying to load a compilation database:
Could not auto-detect compilation database for file "FeatureManager.h"
No compilation database found in /home/babbleshack/ or any parent directory
json-compilation-database: Error while opening JSON database: No such file or directory
Running without flags.
/home/babbleshack/FeatureManager.h:6:10: fatal error: 'unordered_map' file not found
#include <unordered_map>
^~~~~~~~~~~~~~~
1 error generated.
Error while processing /home/babbleshack/FeatureManager.h.
使用clang ++进行编译只会返回警告。
$ clang++ -std=c++11 -Wall FeatureManager.cxx FeatureManager.h
clang-5.0: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated [-Wdeprecated]
没有用于clang-check的标志允许我设置编译标志。
答案 0 :(得分:6)
花了一段时间来解决这个问题,但你可以做到
clang-check file.cxx -- -Wall -std=c++11 -x c++
或者如果你正在使用clang-tidy
clang-tidy file.cxx -- -Wall -std=c++11 -x c++
为了同时使用ALE,我将以下内容添加到我的vimrc
中 let g:ale_cpp_clangtidy_options = '-Wall -std=c++11 -x c++'
let g:ale_cpp_clangcheck_options = '-- -Wall -std=c++11 -x c++'
如果您希望ALE也适用于C,则必须对g:ale_c_clangtidy_options
和g:ale_c_clangcheck_options
执行相同操作。
答案 1 :(得分:0)
我被类似的错误消息困扰了太久了:
/my/project/src/util.h:4:10: error: 'string' file not found [clang-diagnostic-error]
#include <string>
^
我看到其他questions暗示我缺少一些关键软件包,但似乎所有东西都已安装(而我的代码内置很好,它只是clang-tidy
变得不高兴了。
传递-v
表明我的.h
文件的处理方式不同:
$ clang-tidy ... src/*.{h,cc} -- ... -v
...
clang-tool ... -main-file-name util.cc ... -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9 ... -x c++ ... /tmp/copy/src/util_test.cc
...
clang-tool ... -main-file-name util.h ... -x c-header /my/project/src/util.h
...
正如Kris所指出的那样,关键区别是-x c-header
标志,这是因为clang assumes a .h
file contains C, not C++,这又意味着系统C ++包含的系统未被用于处理util.h
。
但是-main-file-name
标志对我也很奇怪。为什么头文件曾经是主文件?在深入研究时,我还遇到了this short but insightful answer,头文件不应直接编译!通过使用src/*.cc
而不是src/*.{h,cc}
可以避免问题,因为永远不会要求Clang首先尝试自行处理.h
!
但是,这的确增加了一个皱纹。这些头文件中的错误默认情况下不会报告,因为它们不是您要求clang-tidy
查看的文件。这是“ 使用-header-filter =。显示来自所有非系统头的错误。”消息clang-tidy
的打印内容。如果我通过-header-filter=src/.*
(只包含我的src
头文件,而不包含-I
随附的任何其他头文件),我在头文件中看到预期的错误。 ew!
我不确定是一般选择-x c++
还是-header-filter=.*
。 -header-filter
的缺点是您必须调整过滤器的正则表达式,而不仅仅是传递要检查的文件。但是另一方面,隔离地处理头文件本质上是浪费工作(我希望在较大的项目中会很快加起来)。