库试图包含<string.h>但是包含我项目中的“string.h”,如何防止?

时间:2015-06-15 17:48:32

标签: c++ compilation include header-files include-path

我的项目中有string.h将其添加到我的标题搜索路径-I(因为我正在使用CMake并从项目根目录编译而不是{{1}的目录位于)。

该项目使用一个外部库,它在我包含的一个头文件中尝试string.h(标准C头),并且意外地最终包括我的#include <string.h>(因为它在包含string.h的标题搜索路径)。

这是显示以下内容的(已编辑的)错误消息:

<>

In file included from /path/to/project/src/random_source_file.cpp:3: In file included from /usr/local/include/SDL2/SDL.h:67: In file included from /usr/local/include/SDL2/SDL_main.h:25: In file included from /usr/local/include/SDL2/SDL_stdinc.h:60: In file included from /path/to/project/src/string.h:7: etc. 的第60行,有SDL_stdinc.h

我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

我使用的2条规则:

1)我创建的包含文件总是通过相对路径包含在内,并且从不包含在环境路径中。

#ifndef DTB_SUPPORT_HH
#include "../../bag/src/dtb_support.hh"
#endif

2)我只通过环境PATH包含库文件,从不使用相对路径。

#include <string>

编辑 - 起源:

我对相对路径的使用包括以下经验:

作为MLOC规模工作的承包商(数百人之一),我 发现原因是在简单文件中添加符号,我们称之为“Foo.hh”。

我用他们的工具找到“Foo.hh”,修改它,并编辑了 我正在努力使用我放在那里的新符号。

然而,在重建期间,编译器抱怨符号是 未知的。

所以我仔细检查了两个文件,并意识到必须有另一个文件 “Foo.hh”。

然后我推出了整个系统的构建,其中包含导致该选项的选项 编译器在编译输出中报告所有文件 包含在每个编译单元中(我认为-H?)。

起初我只访问了我感兴趣的编译单元, 并找到了第二个“Foo.hh”。

好奇心得到了我的最好,所以我通过编译日志, 并发现了成千上万的“Foo.hh”。我不得不收集这些 排成一行,然后用完整的路径对它们进行排序。

事实证明,“Foo.hh”有5条路径。比较它们,5个文件有3个不同的版本。

(仅供参考 - 我从第1个删除了我的符号,将新符号添加到第2个,并且(按方向)忽略了其他3个文件。)