【问题标题】:Xcode: Type 'struct dirent' has incompatible definitions in different translation unitsXcode:类型'struct dirent'在不同的翻译单元中有不兼容的定义
【发布时间】:2018-04-27 18:46:39
【问题描述】:

我正在尝试使用 xv6 的 fs.h 头文件构建程序。

我的 Xcode 项目中只有三个文件:type.h(unmodified)、fs.h(unmodified) 和 main.c,如下所示。

#include <stdio.h>
#include "types.h"
#include "fs.h"
int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}

在命令行gcc -o main main.c -I . 中使用 gcc 成功构建了这个程序,但是 Xcode 在fs.h 中不断给我一个错误(Apple LLVM 9.0 错误):

类型 'struct dirent' 在不同的翻译单元中有不兼容的定义

如果我用任何其他名称替换 fs.h 中的 struct dirent 名称,它可以构建。

我该如何解决?

编辑

运行gcc -o main main.c -I . -H的输出。

. /usr/include/stdio.h
.. /usr/include/_stdio.h
... /usr/include/sys/cdefs.h
.... /usr/include/sys/_symbol_aliasing.h
.... /usr/include/sys/_posix_availability.h
... /usr/include/Availability.h
.... /usr/include/AvailabilityInternal.h
... /usr/include/_types.h
.... /usr/include/sys/_types.h
..... /usr/include/machine/_types.h
...... /usr/include/i386/_types.h
..... /usr/include/sys/_pthread/_pthread_types.h
... /usr/include/sys/_types/_va_list.h
.... /usr/include/machine/types.h
..... /usr/include/i386/types.h
...... /usr/include/sys/_types/_int8_t.h
...... /usr/include/sys/_types/_int16_t.h
...... /usr/include/sys/_types/_int32_t.h
...... /usr/include/sys/_types/_int64_t.h
...... /usr/include/sys/_types/_u_int8_t.h
...... /usr/include/sys/_types/_u_int16_t.h
...... /usr/include/sys/_types/_u_int32_t.h
...... /usr/include/sys/_types/_u_int64_t.h
...... /usr/include/sys/_types/_intptr_t.h
....... /usr/include/machine/types.h
...... /usr/include/sys/_types/_uintptr_t.h
... /usr/include/sys/_types/_size_t.h
... /usr/include/sys/_types/_null.h
... /usr/include/sys/stdio.h
.. /usr/include/sys/_types/_off_t.h
.. /usr/include/sys/_types/_ssize_t.h
.. /usr/include/secure/_stdio.h
... /usr/include/secure/_common.h
. ./types.h
. ./fs.h

这是来自 Xcode 的错误消息:

点击“File has name 'd_ino' here”弹出sys/dirent.h的Xcode编辑器。是不是和macOS系统定义有冲突?

【问题讨论】:

  • 请发布gcc -o main main.c -I . -H完整且未经编辑的输出。
  • @zwol 我刚刚添加了它。
  • 是的,它与系统定义冲突,但我不明白如何。行话“翻译单元”或多或少意味着“一个源文件及其包含的所有标题”; main.c 是唯一涉及的源文件,它直接或间接包含sys/dirent.h(这就是我要求gcc -H 输出的原因——但你会得到一个不同的错误消息,如果这是问题)。所以我唯一能想到的是Xcode,而不是命令行编译器,关心你程序中的struct dirent是否与C库中的struct dirent匹配......
  • ... 而且我 >75% 确信 C 标准说它不应该这样做,只要您自己实际上不使用 sys/dirent.h。所以我很难过。我想我会把这个问题留给真正知道 Xcode 在做什么的人来回答。
  • 抱歉,我帮不上什么忙了。警告:围绕这些部分,有些人会对你非常生气,甚至愤怒地拒绝投票和删除你的问题,如果你曾经谈论“C/C++”,就好像它们不是两种不同的语言一样,或者在同一个问题上同时使用 [c] 和 [c++] 标签。我理解您的意思是 Xcode 在 C 和 C++ 方面都存在奇怪的问题,但请记住在提出未来问题时要非常清楚您使用的是哪种语言。

标签: c xcode llvm xv6


【解决方案1】:

对于那些仍然面临同样问题的人has incompatible definitions in different translation units 特别是对于像 icmp6_hdr

这样的问题

看来这个名字已经被系统或其他东西使用了。

我通过在整个项目中将icmp6_hdr 更改为不同的名称(以icmp6_ex_hdr 为例)来解决此错误

然后清理、重建并运行

【讨论】:

    【解决方案2】:

    对于在 2022 年遇到此问题并且不想或无法重命名其结构的任何人:

    我在一个中文博客上找到了这个帖子:https://www.cnblogs.com/dzqdzq/p/9977638.html

    基本上,简单的解决方法似乎是禁用“启用模块(C 和 Objective-C)”构建设置。似乎禁用此选项会使 XCode Clang 编译器以更类似于 GCC 的方式工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2012-03-11
      相关资源
      最近更新 更多