我的项目中有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
。
我怎样才能解决这个问题?
答案 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个文件。)