【问题标题】:struct stat c++ not compiling in different computerstruct stat c++ 不在不同的计算机上编译
【发布时间】:2014-07-20 20:24:15
【问题描述】:

我想知道如何解决这个错误:

错误:聚合 'Padron_Electoral::getFileSize(const char*)::stat stat_buf' 类型不完整,无法定义

有问题的方法是:

long long const Padron_Electoral::getFileSize(const char* filename) {

     struct stat stat_buf; // This line doesnt compile en the computer Im currently working on, If tried on another computer this method compiles and work.
     int rc = stat(filename, &stat_buf);
    return rc == 0 ? stat_buf.st_size : -1;
}

如果我评论这个方法,其余的代码都会编译,我使用的是 GNU GCC 编译器。两台计算机都有相同的编译器,并且我在代码块中工作。如果我尝试在控制台上编译它,它会抛出同样的错误。有没有人有同样的错误?可能是什么原因以及如何解决?

两台计算机中的代码相同,#include #include 和 .h 文件的包含

它抛出的其他错误:

错误:无效使用不完整类型'struct Padron_Electoral::getFileSize(const char*)::stat'

错误:'struct Padron_Electoral::getFileSize(const char*)::stat'的前向声明

#include 可以包含在编译代码的计算机上,但在另一台计算机上包含抛出错误:

构建:在 Prueba 中调试(编译器:GNU GCC 编译器) c:\mingw\include\io.h|301|错误:'off64_t' 没有命名类型 c:\mingw\include\io.h|302|错误:'off64_t' 没有命名类型 c:\mingw\include\unistd.h|65|错误:'off_t' 尚未声明| C:\Users\Gabriel\Documents\Progra II\Prueba\main.cpp||在函数'int main()'中: C:\Users\Gabriel\Documents\Progra II\Prueba\main.cpp|7|error: aggregate 'main()::stat stat_buf' 类型不完整,无法定义| C:\Users\Gabriel\Documents\Progra II\Prueba\main.cpp|8|错误:无效使用不完整类型'struct main()::stat'| C:\Users\Gabriel\Documents\Progra II\Prueba\main.cpp|7|错误:'struct main()::stat' 的前向声明 构建失败:6 个错误,0 个警告(0 分钟,0 秒)

代码编译失败的电脑操作系统为:Windows 7 Ultimate。

代码编译失败的电脑处理器:Intel Core i5 4440 CPU 3.10GHz

MinGW。 GCC 4.8.1(两台电脑)

IDE:Codeblocks 13.12(两台机器都使用这个IDE)

两者都是 64 位操作系统

编译和工作的计算机操作系统:Windows 7 Home Premium。

编译和工作的计算机处理器:Intel Pentium CPU P6100 2.0GHz

谢谢

编辑:代码现在编译,MinGW32 问题

long long const Padron_Electoral::getFileSize(const char* filename) {
#if __MINGW32__
    struct __stat64 stat_buf;
    int rc = __stat64(filename, &stat_buf);
    return rc == 0 ? stat_buf.st_size : -1;

#else
struct stat stat_buf;
int rc = stat(filename, &stat_buf);
return rc == 0 ? stat_buf.st_size : -1;
#endif
return 0;
}

问题仍然存在,为什么 MinGW 在一台计算机上使用此方法而不是在另一台计算机上引发错误。

【问题讨论】:

  • 你有#include <sys/stat.h>吗?
  • 是的,两台电脑的代码是一样的。我还对 .h 文件进行了包含
  • 试试 sys/types.h 和/或 unistd.h
  • 是否还有其他错误,或者仅此一个?
  • 需要较旧的 posixes #include <sys/types.h>

标签: c++ struct compiler-errors mingw


【解决方案1】:

struct stat 定义在哪里?

编译器告诉你他找不到 stat 的定义,因此 stat_buf 的类型不完整(这意味着它只能定义为指针)。

这意味着您正在编译的两台计算机之间在编译时存在一些差异

要查明问题所在,您应该尝试将问题隔离在一个更简单的程序中,并尝试编译它并在两个系统上运行它。像下面这样就足够了:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main()
{
    struct stat stat_buf; // This line doesnt compile en the computer Im currently working on, If tried on another computer this method compiles and work.
    int rc = stat("testfile.txt", &stat_buf);
    return rc == 0 ? stat_buf.st_size : -1;
}

它是一个完整的编译程序,您应该能够在问题中发布您在两个目标系统上遇到的编译错误。

明确说明两个目标系统(显然不相同)也可能有所帮助: - 编译器版本 - 操作系统 - 处理器 - 如果可能,实际的编译行和/或 makefile。

例如,由于缺少像 _POSIX_C_SOURCE 这样的定义,可能会出现此类问题

如果您提供足够的信息,发现此类问题通常很容易。

编辑: 检查后看来问题与mingw有关。特别是在 64 位系统上使用 MingW32。此处提供了一个可能的解决方案:64 bits file size on Mingw32

【讨论】:

  • @cassiorenan:我主要改写了您(已删除)的答案,使其看起来更像是一个实际的答案。起初我打算通过编辑它来改写你的答案,但在我这样做之前它就被删除了。
  • 嗨,好的,我会添加缺少的信息。 unistd.h 包含在我尝试时不起作用,我怀疑它可能是我使用 MinGW for Windows 但它只是一个疯狂的猜测。我尝试了上面的代码,但它没有在我当前的机器上编译,稍后我会在初始代码编译并工作的机器上尝试。
  • 好吧,在我的代码编译所在的机器上编译的代码在它没有抛出的计算机上编译:c:\mingw\include\io.h|301|error: 'off64_t' does not name一种| c:\mingw\include\io.h|302|错误:'off64_t' 没有命名类型| c:\mingw\include\unistd.h|65|错误:'off_t' 尚未声明|错误:聚合 'main()::stat stat_buf' 类型不完整,无法定义| |错误:无效使用不完整类型'struct main()::stat'|错误:'struct main()::stat'的前向声明
  • 问题很可能与mingw有关。您在 64 位系统上使用 MingW32 吗?如果是这样,问题可能与此有关:stackoverflow.com/questions/12539488/…
  • 另见此处sourceforge.net/p/mingw/bugs/2104 您可以尝试#undef _____STRICT_ANSI_____ 此定义可能由您的编译环境自动设置,如果您拥有它,似乎未定义统计结构所需的某些类型。
【解决方案2】:

代码现在编译,MinGW 32 位在 64 位问题上。希望这对其他人有帮助

long long const Padron_Electoral::getFileSize(const char* filename) {
#if __MINGW32__
struct __stat64 stat_buf;
int rc = __stat64(filename, &stat_buf);
return rc == 0 ? stat_buf.st_size : -1;

#else
 struct stat stat_buf;
 int rc = stat(filename, &stat_buf);
 return rc == 0 ? stat_buf.st_size : -1;
 #endif
 return 0;
}

感谢大家的帮助,特别感谢@kriss,根据Determine 64-bit file size in C on MinGW 32-bit回答

【讨论】:

  • 这个只解决了未声明的stat,但是“off64_t'没有命名类型”的问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多