库尝试包含 <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 个文件。)
我的项目中有一个 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 个文件。)