【发布时间】: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++ 方面都存在奇怪的问题,但请记住在提出未来问题时要非常清楚您使用的是哪种语言。