配置c ++标准库的clang-check

时间:2017-11-30 21:40:23

标签: c++11 clang++

我正在尝试运行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的标志允许我设置编译标志。

2 个答案:

答案 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_optionsg: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的缺点是您必须调整过滤器的正则表达式,而不仅仅是传递要检查的文件。但是另一方面,隔离地处理头文件本质上是浪费工作(我希望在较大的项目中会很快加起来)。