【发布时间】:2018-02-02 21:18:44
【问题描述】:
我正在开发一个使用 Qt 的 c++ 项目。我启用了 syntastic 通过我的 vimrc 检查头文件,它的检查器(gcc、clang_check 和 clang_tidy)在我的项目中都抱怨同样的事情:他们无法找到特定的头文件。
有问题的头文件是“QtCore/qconfig-64.h”。他们是正确的,这个文件不存在。问题是该文件不应加载到项目中,因为它是 32 位项目。 'QtCore/qconfig.h' 有一个预处理器方向,告知项目要包含的内容:
#if __WORDSIZE == 32
#include "QtCore/qconfig-32.h"
#elif __WORDSIZE == 64
#include "QtCore/qconfig-64.h"
#else
#error "unexpected value for __WORDSIZE macro"
#endif
是否有任何适当的解决方案可以让语法识别预处理器指令选择要包含的头文件?如果没有,还有哪些其他变通方法可以消除这些错误,同时最大限度地减少实用性损失?
【问题讨论】:
-
阅读
:h syntastic-debug和:h syntastic-cpp-gcc,并尝试使 syntastic 运行与编译文件相同的命令行。由于 Vim 和 syntastic 的工作方式,这可能会给后面带来痛苦,但这是唯一有意义的方法。 -
@SatoKatsura :下次有机会我会查看合成调试信息。至于 syntastic 是否运行与我的编译器相同的命令,我指示 syntastic 使用插件附带的 cc_args.py 脚本生成的 .clang_complete 文件。对于大多数实际目的,我觉得它(如果不准确的话)足够接近相同的命令。我对当前信息的最佳推测是 Syntastic 搜索包含语句的代码的方式要么没有考虑 #if 语句,要么没有考虑适用于它们的环境变量。
-
Syntastic 不关心
#ifs 或文件的内容。 syntastic 所做的是运行 linters,在本例中为gcc、clang-check和clang-tidy(附带说明:clang-tidy完成了clang-check所做的所有事情,因此您不需要同时运行两者)。如果您不向这些 linter 提供所有相关的-Dfoo=bar,您将得到无用的错误,和/或他们会在不检查任何内容的情况下退出。除非你特别擅长 ESP,否则:h syntastic-debug会出现这种情况。 -
好的,我现在看到了。似乎
clang_complete的 cc_args.py 忽略了几种类型的编译器标志。我注意到它离开了-O2,导致与_FORTIFY_SOURCE 相关的警告。似乎它还没有使用-m32标志来告知程序的 32 位特性。需要注意的是,将这些标志传递给syntastic_cpp_compiler_options可以解决gcc的问题,但是clang_check和clang_tidy似乎没有他们的mkprg命令被这个变量改变。但是,该问题可能属于其自己的问题(如果尚未涵盖)或错误报告。 -
您可以考虑在提交错误报告之前阅读手册(
:h syntastic-c-clang_tidy等)。 耸耸肩
标签: c++ qt vim c-preprocessor syntastic