Я использую -D_FILE_OFFSET_BITS=64
при компиляции моего приложения в Unix. Он правильно HP-uX
на 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 to 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 int".
Чтобы решить вышеуказанную проблему, я добавил #define _FILE_OFFSET_BITS 64. Было обнаружено, что в одном из заголовков одинаковое значение флага установлено равным 32. Я не знаю, что произошло, но использование флага компиляции не переопределило это #define. Затем я добавил следующее после #include:
#ifdef <SunOS>
#undef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 64
#endif
Это исправляет ошибку времени компиляции. Но теперь есть еще одна проблема: члены stat stat после вызова stat() не заполняются должным образом. Я не знаю, почему это происходит.
Любая помощь здесь очень ценится.
Часть "нескалярного типа" сообщения об ошибке является подозрительной, поскольку это означает, что off_t реализуется как некоторая структура вместо 64-разрядного целого.
Является ли gcc актуальным на машине Solaris? В частности, если вы используете gcc 4.3.0 для Solaris, вы можете столкнуться с ошибкой GCC 30513 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=30513). Если вы посмотрите на комментарий 9 в отчете об ошибке, вы увидите, что они получают очень похожую ошибку: "преобразование из" jlong "в нескалярный тип" off_t "запрошено".