Ошибка поиска при использовании -D_FILE_OFFSET_BITS = 64 в Solaris

0

Я использую -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() не заполняются должным образом. Я не знаю, почему это происходит.

Любая помощь здесь очень ценится.

  • 0
    ac-archive.sourceforge.net/largefile/solaris.print.html
  • 0
    В ссылке, которую я разместил в предыдущем комментарии, упоминается, что long это #defined to off_t, поэтому его не нужно явно менять.
Теги:
solaris

1 ответ

0

Часть "нескалярного типа" сообщения об ошибке является подозрительной, поскольку это означает, что 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 "запрошено".

  • 0
    Версия gcc старше 4.3.0. Его 3.4.2 :(.
  • 0
    Я отредактировал свой вопрос для контента types.h.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню