库尝试包含 <string.h> 但包含我项目中的 "string.h",如何防止?

Library tries to include <string.h> but includes "string.h" from my project, how to prevent?

我的项目中有一个 string.h 添加到我的 header 搜索路径 -I (因为我正在使用 CMake 并从项目根目录而不是string.h 所在的目录)。

该项目使用了一个外部库,该库试图在我包含的其中一个 header 文件中 #include <string.h>(标准 C header),但不小心最终包含了我的 string.h(因为它位于包含 <> 使用的 header 搜索路径上)。

这是揭示这一点的(编辑过的)错误消息:

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.

SDL_stdinc.h 的第 60 行有 #include <string.h>.

我该如何解决这个问题?

我使用的 2 条规则:

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

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

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

#include <string>

编辑 - 起源:

我对相对路径 include 的使用源于以下经历:

作为 MLOC 规模工作的承包商(数百名之一),我 找到将符号添加到简单文件的原因,我们称之为 "Foo.hh".

我用他们的工具找到了"Foo.hh",修改了它,并编辑了 我正在处理的文件使用我放在那里的新符号。

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

所以我仔细检查了两个文件,意识到一定还有另一个 "Foo.hh".

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

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

好奇心打败了我,所以我翻阅了编译日志, 并找到了 "Foo.hh" 的数千个包含。我不得不收集这些 排列在一起,并用完整路径对它们进行排序。

原来有 5 条路径通往 "Foo.hh"。对比一下,5个文件是3个不同的版本。

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