如何处理标头名称与标准库标头冲突,但不更改文件名?
How to handle header name conflict with standerd library header, but do not change file name?
我正在尝试编译tudu项目:https://github.com/meskio/tudu,我遇到了特定的问题:他们有sched.h
文件,与标准库中使用的名称相同:libc6-dev:amd64: /usr/include/sched.h
。问题是其他一些标准库标头尝试包含sched.h
并且它采用本地库而不是库文件。这会导致错误。是否可以在不修改任何文件名的情况下设置编译器(包括路径或 sth)来修复这种情况?
这是有问题的包含操作:
In file included from ./data.h:28,
from ./sched.h:24, // <- pthread.h includes local file
// instead of /usr/include/sched.h
from /usr/include/pthread.h:23,
更新: 我有点哆嗦,发现在 gcc 文档中包含规则:
默认情况下,预处理器首先查找指令的引号形式中包含的头文件 #include"file"相对于当前文件的目录,然后在标准系统目录的预配置列表中查找。例如,如果/usr/include/sys/stat.h 包含 #include"types.h",GCC 首先在/usr/include/sys 中查找 types.h,然后在其通常的搜索路径中查找。
对于尖括号形式 #include,预处理器的默认行为是只在标准系统目录中查找。确切的搜索目录列表取决于目标系统、GCC 的配置方式以及安装位置。您可以通过使用 -v 选项调用 CPP 版本来查找该版本的默认搜索目录列表。例如
似乎第二条规则在我的系统中不正确,我想知道为什么。通常,它实际上在系统目录中查找标头 - 否则将不包括pthread.h
。但是当包含shed.h
时,它显示 cpp 更喜欢当前本地目录而不是系统包含路径和"与包含的文件相同的路径"。奇怪。。。
我看到问题与我设置CPLUS_INCLUDE_PATH
的事实有关。这个项目的问题解决了,但我仍然不明白这种奇怪的行为。我的CPLUS_INCLUDE_PATH
指向其他不相关的目录,因此它不会影响这个项目(它没有引入任何其他名称冲突)。当CPLUS_INCLUDE_PATH为空或不存在时,一切都会正确构建。
我知道这很奇怪,但是在 ubuntu9.3.0~1 上使用 gcc 版本 20.04 时遇到了同样的问题。我制作了一个新的标头 sched.h,同时自然地与 linux usr/include/sched 冲突。
我尝试同时使用包含",这应该是自然的选择,因为我在当前目录中有该文件,然后<>只是为了碰碰运气(但它注定会失败)。
对于面临此问题的任何人,只需使用"../foldername/headerfile.h"以确保您可以指向正确的文件夹。
希望对您有所帮助。让我知道是否可以做得更好。
- 从命令行c++发送文本文件名
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 写入位置0x0000000C时发生访问冲突
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- C++尝试深度复制唯一指针时出现内存访问冲突
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 错误:使用通用引用的声明冲突
- 如何解决GTest和LibTorch联动冲突
- 两个运营商的一些奇怪的冲突<<
- 如何处理标头名称与标准库标头冲突,但不更改文件名?
- Cmake依赖关系与同一标头文件名的冲突
- CMake - 两个库中的相同文件名发生冲突