【发布时间】:2014-06-03 16:34:55
【问题描述】:
我在 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 得到#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 结构成员没有正确填充。我不知道为什么会这样。
非常感谢这里的任何帮助..
【问题讨论】:
-
在我之前评论中发布的链接中,提到long是#defined to off_t,因此不应明确要求更改它。