Как определить _FILE_OFFSET_BITS & amp; Макрос _LARGE_FILES для Solaris и HP-AIX

У меня есть программа C, как следует.
Я не знаю, что использовать stat64 вместо stat в обоих Solaris & HP-AIX.
Я хочу построить эту Программу на Solaris & HP-AIX.

#include "zunx.h"#include <nls.h>

/*
* NAME:        zunx_file_exists
*
* PURPOSE:     Checks if a file exists.
*
* INVOCATION:  boolean zunx_file_exists(name)
*              char *name;
*
* INPUTS:      name    - file to check
*
* OUTPUTS:     TRUE or FALSE
*
* DESCRIPTION: zunx_file_exists does a stat on the specified file,
*              and returns TRUE if a stat is found.  No check is
*              made to determine what type of file it is.
*/
boolean zunx_file_exists
(const char *buf)
{

#if defined(UNIX)
struct stat fstat;

if (buf != NULL && stat(I2E1(buf), &fstat) == 0)
return TRUE;
else
return FALSE;
#endif

#ifdef NT_OS
struct _stat64 fstat;

if (buf != NULL && _stat64((char *) I2E1(buf), &fstat) == 0)
return TRUE;
else
return FALSE;
#endif
}

Я наткнулся на макрос в Солярисе, как:

 #ifdef UNIX
#define _FILE_OFFSET_BITS 64
#endif

это определение правильно для вышеуказанной программы?

для HP-AIX его использование _LARGE_FILES макро.

но я не знаю, как определить этот макрос в приведенной выше программе для успешного запуска на обеих ОС.

Пожалуйста, предложите несколько идей.

0

Решение

Подробные данные для доступа к большим файлам, включая компиляцию больших файлов, ссылки и другие флаги, можно найти для Solaris на lfcompile справочная страница:

lfcompile

  • среда компиляции больших файлов для 32-битных приложений

Описание

Все 64-битные приложения могут манипулировать большими файлами по умолчанию.
методы, описанные на этой странице, позволяют 32-битным приложениям манипулировать
большие файлы.

Обратите внимание, что на странице man конкретно указано, что определяет, кроме тех, которые возвращаются через getconf необходимы:

Установите флаг времени компиляции _FILE_OFFSET_BITS равным 64, прежде чем включать какие-либо заголовки. Приложения могут комбинировать объекты, созданные в среде компиляции больших файлов, с объектами, созданными в среде переходной компиляции, но должны соблюдать осторожность в отношении взаимодействия между этими объектами. Приложения не должны объявлять глобальные переменные типов, размеры которых меняются в зависимости от среды компиляции.

вместе с

Приложения, желающие получить доступ к fseeko () и ftello (), а также интерфейсам, соответствующим спецификации POSIX и X / Open, должны определить для макроса _LARGEFILE_SOURCE значение 1 и установить любые макросы тестирования функций, подходящие для получения желаемой среды (см. Стандарты (5 )).

Подробности смотрите в разделе примеров на странице руководства.

2

Другие решения

Точные названия и значения этих #defineЭто зависит от реализации. К счастью, getconf Команда оболочки скажет вам, что это, когда вы передадите его LFS_CFLAGS параметр. Затем вы можете передать их в командной строке при компиляции.

gcc `getconf LFS_CFLAGS` -o program program.c
1

По вопросам рекламы [email protected]