【问题标题】:lseek error when -D_FILE_OFFSET_BITS=64 is used on solaris在 solaris 上使用 -D_FILE_OFFSET_BITS=64 时出现 lseek 错误
【发布时间】:2014-06-03 16:34:55
【问题描述】:

我在 Unix 上编译我的应用程序时使用了-D_FILE_OFFSET_BITS=64 标志。它在RHELSuSEHP-uXAIX 上正确构建。

在 Solaris 上,我收到以下错误:

long lPos = 0L;
long UTMPSIZE = sizeof(struct utmp);
int fd = 0;

fd = open("/etc/utmp", O_RDONLY);
UTMPSIZE = sizeof(struct utmpx);
lPos = lseek(fd, -UTMPSIZE, SEEK_END); // error: conversion from `long int' to non-scalar type `off_t' requested

我在某处读到使用-D_FILE_OFFSET_BITS=64,long 得到#defined 到off_t。 如果是这样,为什么会出现这个错误?

我在一个 cpp 程序中编写了相同的步骤,在 soalris 系统上编译和执行,它可以工作。但是,只有在编译应用程序时,才会看到错误。

这就是我在 types.h 中的内容:

#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)
typedef long long               longlong_t;
typedef unsigned long long      u_longlong_t;
#else
/* used to reserve space and generate alignment */
typedef union {
        double  _d;
        int32_t _l[2];
} longlong_t;
typedef union {
        double          _d;
        uint32_t        _l[2];
} u_longlong_t;
#endif  /* __STDC__ - 0 == 0 && !defined(_NO_LONGLONG) */

#ifndef _OFF_T
#define _OFF_T

#if defined(_LP64) || _FILE_OFFSET_BITS == 32
typedef long            off_t;          /* offsets within files */
#elif _FILE_OFFSET_BITS == 64
typedef longlong_t      off_t;          /* offsets within files */
#endif

#if defined(_LARGEFILE64_SOURCE)
#ifdef _LP64
typedef off_t           off64_t;        /* offsets within files */
#else
typedef longlong_t      off64_t;        /* offsets within files */
#endif
#endif  /* _LARGEFILE64_SOURCE */

#endif /* _OFF_T */

如果我在代码中使用 long long,则错误现在更改为“long long int”。

为了解决上述问题,我添加了#define _FILE_OFFSET_BITS 64。发现在其中一个标头中,相同的标志值设置为32。我不知道发生了什么,但是使用编译时标志并没有覆盖它#定义。然后我在#include 之后添加了以下内容:

#ifdef <SunOS>
#undef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 64
#endif

这纠正了编译时错误。但是现在还有另一个问题,stat() 调用后的 stat 结构成员没有正确填充。我不知道为什么会这样。

非常感谢这里的任何帮助..

【问题讨论】:

标签: c++ c solaris


【解决方案1】:

错误消息的“非标量类型”部分是可疑的,因为它暗示 off_t 被实现为某种结构而不是 64 位整数。

gcc 在 Solaris 机器上是最新的吗?具体来说,如果您在 Solaris 上使用 gcc 4.3.0,您可能会遇到 GCC 错误 30513 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30513)。如果您查看错误报告中的注释 9,您会看到他们得到了一个非常相似的错误:“conversion from 'jlong​​' to non-scalar type 'off_t' requested”。

【讨论】:

  • gcc 版本早于 4.3.0。它的 3.4.2 :(.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多