Как включить поддержку больших файлов в Darwin?

У меня есть приложение C, которое я пытаюсь скомпилировать для Mac OS X 10.6.4:

$ uname -v
Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386

Мой gcc выглядит следующим образом:

$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)

Мой Makefile выглядит следующим образом:

CC=gcc
CFLAGS=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -O3 -Wformat -Wall -pedantic -std=gnu99

all: myApp
    rm -rf *~

myApp: myApp.o
    ${CC} ${CFLAGS} myApp.o -lbz2 -o myApp
    rm -rf *~

clean:
    rm -rf *.o myApp

Проблема в том, что мое приложение вызывает fseeko64 и fopen64 и использует тип off64_t для смещений. Когда я компилирую свое приложение, я получаю следующие предупреждения и ошибки:

$ make myApp
gcc -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -O3 -Wformat -Wall -pedantic -std=gnu99   -c -o myApp.o myApp.c
myApp.c: In function ‘extractData’:
myApp.c:119: warning: implicit declaration of function ‘fseeko64’
myApp.c:119: error: ‘off64_t’ undeclared (first use in this function)
myApp.c:119: error: (Each undeclared identifier is reported only once
myApp.c:119: error: for each function it appears in.)
myApp.c: In function ‘extractMetadata’:
myApp.c:305: warning: implicit declaration of function ‘fopen64’
myApp.c:305: warning: assignment makes pointer from integer without a cast

Мой код строится без ошибок под Linux. Какие изменения я могу внести в исходный код, чтобы добавить поддержку больших файлов при сборке под Darwin?


person Alex Reynolds    schedule 23.10.2010    source источник


Ответы (3)


В Darwin файловый ввод-вывод по умолчанию 64-битный (по крайней мере 10.5), просто нашел это, выполнив поиск в /usr/include:

sys/_types.h:typedef __int64_t  __darwin_off_t;

unistd.h:typedef __darwin_off_t     off_t;

Итак, все, что вам нужно сделать, это что-то вроде

#ifdef __APPLE__
#  define off64_t off_t
#  define fopen64 fopen
...
#endif
person mojuba    schedule 23.10.2010
comment
@AlexReynolds Я бы не назвал это идеальным, смотрите мой ответ. - person aergistal; 05.09.2015

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

Например, для функции fopen64 GNU C Library документы говорят:

Если исходники скомпилированы с помощью _FILE_OFFSET_BITS == 64 на 32-битной машине, эта функция доступна под именем fopen и, таким образом, прозрачно заменяет старый интерфейс.

Вы можете просто использовать ту же функцию fopen в системах, которые по умолчанию поддерживают 64-битный ввод-вывод, и вы можете установить флаг _FILE_OFFSET_BITS=64 на 32-битном без необходимости переопределения записи вообще. То же самое касается таких типов, как off64_t против off_t.

Сохраните переопределения для случая, когда вам приходится иметь дело со сторонними исходниками и использовать стандартные функции в собственном коде.

person aergistal    schedule 05.09.2015
comment
Это должен быть принятый ответ. Это правильный способ исправить это. - person Sam; 07.07.2016
comment
Я изучил это подробнее, и хотя это должен быть принятый ответ для платформ, отличных от Дарвина, на Дарвине они сделали файловые функции 64-битными, а _FILE_OFFSET_BITS и _LARGEFILE64_SOURCE не существуют. Таким образом, принятый ответ, вероятно, является лучшим способом решить такую ​​​​проблему переносимости. - person Sam; 07.07.2016

fseeko и подобные команды работают с поддержкой больших файлов, поэтому нет необходимости в fseeko64 и т. д. Справочная страница Apple

person mmmmmm    schedule 23.10.2010