У меня есть программа 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
макро.
но я не знаю, как определить этот макрос в приведенной выше программе для успешного запуска на обеих ОС.
Пожалуйста, предложите несколько идей.
Подробные данные для доступа к большим файлам, включая компиляцию больших файлов, ссылки и другие флаги, можно найти для Solaris на lfcompile
справочная страница:
lfcompile
- среда компиляции больших файлов для 32-битных приложений
Описание
Все 64-битные приложения могут манипулировать большими файлами по умолчанию.
методы, описанные на этой странице, позволяют 32-битным приложениям манипулировать
большие файлы.…
Обратите внимание, что на странице man конкретно указано, что определяет, кроме тех, которые возвращаются через getconf
необходимы:
Установите флаг времени компиляции _FILE_OFFSET_BITS равным 64, прежде чем включать какие-либо заголовки. Приложения могут комбинировать объекты, созданные в среде компиляции больших файлов, с объектами, созданными в среде переходной компиляции, но должны соблюдать осторожность в отношении взаимодействия между этими объектами. Приложения не должны объявлять глобальные переменные типов, размеры которых меняются в зависимости от среды компиляции.
вместе с
Приложения, желающие получить доступ к fseeko () и ftello (), а также интерфейсам, соответствующим спецификации POSIX и X / Open, должны определить для макроса _LARGEFILE_SOURCE значение 1 и установить любые макросы тестирования функций, подходящие для получения желаемой среды (см. Стандарты (5 )).
Подробности смотрите в разделе примеров на странице руководства.
Точные названия и значения этих #define
Это зависит от реализации. К счастью, getconf
Команда оболочки скажет вам, что это, когда вы передадите его LFS_CFLAGS
параметр. Затем вы можете передать их в командной строке при компиляции.
gcc `getconf LFS_CFLAGS` -o program program.c