【问题标题】:How to handle header name conflict with standerd library header, but do not change file name?如何处理标头名称与标准库标头冲突,但不更改文件名?
【发布时间】:2019-07-15 20:03:09
【问题描述】:

我正在尝试编译 tudu 项目:https://github.com/meskio/tudu,我遇到了具体问题:他们有 sched.h 文件,与标准库中使用的名称相同:libc6-dev:amd64: /usr/include/sched.h。问题是其他一些 标准库头 试图包含 sched.h 并且它采用本地而不是库文件。这会导致错误。是否可以在不修改任何文件名的情况下设置编译器(包括路径或某事)来修复这种情况?

这是有问题的包含操作:

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 更喜欢当前本地目录而不是系统包含路径和“与包含文件相同的路径”。奇怪……

【问题讨论】:

  • 排除本地头的正确方法是#include &lt;...&gt;而不是#include "..."
  • 但情况是库头包含错误的文件
  • 库应该将它们的标题放到一个子目录中以避免这个问题,即#include "tudu/sched.h"
  • 对我来说编译得很好。您使用的是什么操作系统和编译器?你运行了什么命令?
  • ./配置和制作。 Debian 破坏者;我今天能够在 ubuntu 上构建,但目前我不知道那里的标准库头文件的状态/配置。

标签: c++


【解决方案1】:

我发现问题与我设置了CPLUS_INCLUDE_PATH 的事实有关。该项目的问题已解决,但我仍然不明白这种奇怪的行为。我的CPLUS_INCLUDE_PATH 指向其他不相关的目录,所以它不应该影响这个项目(它没有引入任何额外的名称冲突)。当 CPLUS_INCLUDE_PATH 为空或不存在时,一切都会正确构建。

【讨论】:

    【解决方案2】:

    我知道这很奇怪,但我在 ubuntu1~20.04 上使用 gcc 版本 9.3.0 时遇到了同样的问题。我在与 linux usr/include/sched 自然冲突时创建了一个新的头文件 sched.h。

    我尝试同时使用 include "" 这应该是自然的选择,因为我在当前目录中有文件,然后 只是为了试试运气(但它注定会失败)。

    对于遇到此问题的任何人,只需使用“../foldername/headerfile.h”来确保您可以指向正确的文件夹。

    希望对您有所帮助。让我知道是否可以做得更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2016-06-14
      • 1970-01-01
      • 2018-12-19
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多