C++ 系统文件 bits/stat.h 突然中断并出现“错误:字段‘st_atim’的类型不完整”

Posted

技术标签:

【中文标题】C++ 系统文件 bits/stat.h 突然中断并出现“错误:字段‘st_atim’的类型不完整”【英文标题】:C++ system file bits/stat.h suddenly breaks with "error: field ‘st_atim’ has incomplete type" 【发布时间】:2013-02-03 13:20:32 【问题描述】:

我正在将一个已知可以工作的大型旧系统移植到 Ubuntu 64 位 Linux 上。系统使用FLTK,升级到1.3.2,我用的是NetBeans。文件包括基本通用 /FL/Fl.H 作为其第一行。这包括较新的 unicode 启用程序 /FL/fl_utf8.h。这包括系统文件<sys/stat.h>,然后包括系统文件<bits/stat.h>。当把它连接起来,并且 -I 包括各种不同的目录时,突然系统文件在编译时中断:

In file included from /usr/include/sys/stat.h:107,
/usr/include/bits/stat.h:88: error: field ‘st_atim’ has incomplete type
/usr/include/bits/stat.h:89: error: field ‘st_mtim’ has incomplete type
/usr/include/bits/stat.h:90: error: field ‘st_ctim’ has incomplete type
/usr/include/bits/stat.h:149: error: field ‘st_atim’ has incomplete type
/usr/include/bits/stat.h:150: error: field ‘st_mtim’ has incomplete type
/usr/include/bits/stat.h:151: error: field ‘st_ctim’ has incomplete type

最新的 FLTK 不工作了吗?对 64 位过敏?互联网提示系统头文件中的错误? glibc 不兼容?添加_GNU_SOURCE?不要 USE_MISC 吗?博客里乱七八糟的,这是怎么回事?

【问题讨论】:

【参考方案1】:

简短的回答:某人在某处创建了一个名为“time.h”的随机文件。您的包含路径已包含此目录。这以不明显的方式使系统短路。该文件甚至不必使用,它可能是一个随机测试暂存文件,其中一位程序员放在一边,而不是合并到其中。它只需要存在,并且可以在更大的包含路径中访问。这足以让你流连忘返。根本不是 FLTK 问题。

更长的答案:stat.h 从基于__time_t st_atime 等升级到基于struct timespec st_atim 等[注意末尾缺少e] 用于处理纳秒分辨率时间戳。但是 timespec 在系统的time.h 中定义。如果您在路径中的某处包含一个随机 time.h,这会影响包含,从而消除 struct timespec 的定义。

显然,同样的问题也是 FFMpeg v1.0 和 /include/libavutil 的问题。

底线:坚持没有人制作过名为“time.h”的文件。

【讨论】:

嗨..感谢您的回答。我在从 FFMpeg v1.0 制作 ffmpeg-php 时遇到了这个错误。我的问题是(对不起,如果这听起来像一个绝对的 n00b 问题),我应该怎么做才能覆盖它并继续构建? 1) 浏览您的包含目录 (2) 追踪您添加随机 time.h 的位置 (3) 用湿意大利面条公开连枷程序员 (4) 更改假 time.h 文件的名称到其他东西 (5) 从系统中查找您自己的 stat.h 和 time.h,确保它们被包括在内 (6) 重制 (7) 用跳舞的大象和五彩纸屑庆祝。祝你好运。 ffmpeg 有一个libavutil/time.h 文件 捷径:mv /usr/local/include/libavutil/time.h /usr/local/include/libavutil/time.h_ make sudo mv /usr/local/include/libavutil/time. h_ /usr/local/include/libavutil/time.h 或禁用 libavutil【参考方案2】:

当我在 Centos 6.5 中遇到这个问题时,我使用了一个非常可靠的快速修复程序。以为我会分享以防其他人偶然发现此线程。有一个由 https://github.com/tony2001 创建和维护的存储库,它解决了 time.h 文件冲突的问题。

按照下面的方法修复它:

git clone https://github.com/tony2001/ffmpeg-php.git
cd ffmpeg-php
phpize
./configure
make && make install

【讨论】:

【参考方案3】:

我意识到这个问题已经过时了,但我会发布我的经验,因为我现在正在阅读这本书并且这发生在我身上。我能够通过重新启动运行磁盘的虚拟计算机来解决此问题。

我认为发生在我身上的是我通过将磁盘映像安装到我计算机的一个虚拟驱动器来运行虚拟机。当我完成一天的工作时,我会保存我的虚拟机状态,然后加载该状态并在以后继续处理它。但是,有时我会重新启动物理计算机,这会从驱动器中卸载 cd 映像,但我没有注意到这一点,因为虚拟机启动时没有问题,因为我只是重新加载保存状态,直到你的问题发生在我身上.

重新挂载磁盘映像,然后重新启动虚拟机为我解决了这个问题,对于通过虚拟机运行 livecd 映像的其他人来说可能也是如此。我认为可以解释这一点的唯一另一件事是,书中的某些程序可能会弄乱某些包含,并且重新启动只会将机器恢复到原始的工作状态。

如果您在物理上运行磁盘,这可能对您没有帮助,但重新启动计算机可能是一个不错的尝试。附带说明一下,我最初是在我的旧笔记本电脑上实际运行 cd,并且书中的所有程序都运行良好。这很令人沮丧,因为虚拟机给了我一些问题,而我最初并没有在物理上运行实际磁盘。

【讨论】:

以上是关于C++ 系统文件 bits/stat.h 突然中断并出现“错误:字段‘st_atim’的类型不完整”的主要内容,如果未能解决你的问题,请参考以下文章

Win10复制共享文件夹里面文件时复制中突然窗口闪退explorer.exe重启复制中断,无法复制文件

C++程序,内存占用一直增加,最后无法分配内存而中断

单片机的中断系统

与头文件一起使用时,使用个人 C++ 库编译代码会中断

如何中断嵌入在 C++ 应用程序中的 python 解释器

STM32F104ZET6 中断系统