在solaris上使用-D_FILE_OFFSET_BITS = 64时出现lseek错误

时间:2014-05-29 11:22:45

标签: c++ c solaris

我在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长度获得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结构成员没有正确填充。我不知道为什么会发生这样的事情。

非常感谢任何帮助..

1 个答案:

答案 0 :(得分:0)

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

在Solaris机器上gcc是最新的吗?具体来说,如果您在Solaris上使用gcc 4.3.0,则可能遇到GCC错误30513(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30513)。如果你看错误报告中的评论9,你会发现他们得到了一个非常相似的错误:&#34;转换来自&#39; jlong​​&#39;到非标量类型&#39; off_t&#39;请求&#34;