我在Unix上编译应用程序时使用-D_FILE_OFFSET_BITS=64
标志。它可以在RHEL
,SuSE
,HP-uX
和AIX
上正确构建。
在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结构成员没有正确填充。我不知道为什么会发生这样的事情。
非常感谢任何帮助..
答案 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;