递归包含头文件以供Syntastic使用

21

我正在处理一个C++项目并尝试配置它以使用syntastic。在我的项目中,我有一个嵌套的头文件目录结构(实际嵌套结构要糟糕得多,这只是一个示例)。

--libs    
    |---dir1
         |---foo1.h    
    |---dir2
         |---foo2.h
         |---foo3.h
         |---dir3
               |---foo4.h

我在我的 .vimrc 文件中使用如下代码引用库文件:

let g:syntastic_cpp_include_dirs = [ 'libs/']

我以为这样会递归地包含所有头文件,但实际上并没有。在代码中,syntastic 报错“找不到该文件或目录”。

当我显式更改变量引用特定目录时:

let g:syntastic_cpp_include_dirs = [ 'libs/dir2/dir3/']

就可以正常工作了。

我的问题如下:

  1. 如何配置 syntastic 以递归方式包含一组目录的头文件?
  2. 如何在多个项目中进行配置? 每次切换项目时都要编辑 .vimrc 文件似乎不太合适。 我相信一定有更好的方法。

编辑:

我没有提到在我的 .vimrc 中,以下选项适用于 syntastic:

let g:syntastic_check_on_open=1
let g:syntastic_enable_signs=1
let g:syntastic_cpp_include_dirs = ['libs/dir2/dir3', 'libs/dir2 ]
let g:syntastic_cpp_check_header = 1
let g:syntastic_cpp_remove_include_errors = 1

你尝试过 let g:syntastic_cpp_check_header = 1 吗? - timss
是的,我有。我现在已经将我所拥有的配置选项添加到问题中了。对此很抱歉。 - dev_nut
2个回答

36
你可以在项目根目录下的一个名为.syntastic_cpp_config的文件中包含每个项目中用于搜索头文件的所有目录。做法的格式与向编译器提供-I指令相同。
对于你的情况,意味着:
  • sources下创建一个名为.syntastic_cpp_config的文件(假设这是你的代码所在的位置,并且sourceslibs处于目录层次结构中的同一深度级别)。
  • 将以下行放入其中:
  • -Ilibs/dir1

    -Ilibs/dir2

    -Ilibs/dir2/dir3

  • 请注意每行只有一个标志。
  • 这样你就不必在.vimrc中拥有所有包含目录。
你可以为每个项目设置一个不同的文件来保存这个自定义配置,通过.vimrc全局变量g:syntastic_cpp_config_file指定文件名。
let g:syntastic_cpp_config_file = '.my_custom_include_file_for_syntastic'

Syntastic会检查每个源目录及其上层目录,直到找到该文件,并使用它来生成输出。

有关详细信息,请参见Syntastic维基页面旧链接


7
这段内容在2018年5月24日进行了更新,现已过时。.syntastic_cpp_config不再具有"魔力",你必须使用let g:syntastic_cpp_config_file = ...来显式地设置它。 - user2201041
也许我有点过于追求完美了,这可能不是提出/询问这个问题的正确场所,但是:在项目文件夹中专门为此目的创建一个文件是否被认为是干净的?虽然它可以添加到正在工作的项目的.gitignore中,但我不希望其他开发人员也使用Syntastic。 - mazunki
但如果其他人也在使用Syntastic,这对他们也会有帮助。如果他们不使用也没有关系,毕竟这只是一个点文件。 - user4945014

0

我也有同样的问题,但是运气不太好。然而,我发现如果我使用引号标记的头文件包含方式,语法检查会适当地检查文件夹并且不会发出警告。例如,如果你正在处理foo2.cpp,

#include "dir3/foo4.h"
#include "../dir1/foo1.h"

保存标准库和任何你想硬编码到vim中的库的括号包含。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接