2016-02-23 6 views
0

У меня есть программа C, как показано ниже. Мне нечего использовать stat64 вместо stat в обоих Solaris & HP-AIX. Я хочу создать эту программу на обоих Solaris & HP-AIX.Как определить макрос _FILE_OFFSET_BITS & _LARGE_FILES для 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 
} 

я наткнулся на макрос в Solaris нравится:

#ifdef UNIX 
    #define _FILE_OFFSET_BITS 64 
#endif 

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

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

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

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

+0

Где вы определили 'UNIX' или' NT_OS'? – SKD

+2

IME, самый простой способ - скомпилировать приложение как 64 бит. Флаги «LARGE_FILES»/etc предназначены только для 32-битных приложений. В противном случае IIRC 'stat64()' должен быть всегда доступен вместе с обычным 'stat()': они существуют специально для облегчения использования 64-битного интерфейса для 32-битных приложений. – Dummy00001

+0

Вы можете использовать опцию -D для определения макроса при компиляции. Я также предлагаю проверить это. http://stackoverflow.com/questions/4357570/use-file-offset64-vs-file-offset-bits-64 –

ответ

1

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

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

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

lfcompile

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

Описание

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

...

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

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

наряду с

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

Подробнее см. В разделе примеров справочной страницы.

 Смежные вопросы

  • Нет связанных вопросов^_^