Как включить большую поддержку файлов под Дарвином?
-
25-09-2019 - |
Вопрос
У меня есть приложение 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 файл ввода / вывода - 64-битный по умолчанию (по крайней мере, 10.5), только что нашел это путем Grepping в / usr / включает в себя:
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
Другие советы
Хотя этот вопрос оказывает голосованный ответ, который работает, я думаю, что решение немного вводит в заблуждение. Вместо того, чтобы исправить что-то Всегда лучше избегать необходимости исправлять его позже в первую очередь.
Например для fopen64
функция GNU C Библиотека Документы говорят:
Если источники скомпилированы с
_FILE_OFFSET_BITS == 64
на 32 битах Эта функция доступна под названиемfopen
и так прозрачно заменяет старый интерфейс.
Вы можете просто использовать ту же функцию fopen
на системах, которые поддерживают 64-битный ввод / вывод по умолчанию, и вы можете установить _FILE_OFFSET_BITS=64
Флаг на 32-битном без необходимости написать переопределенные вообще. То же самое касается типов, как off64_t
против. off_t
.
Сохраните репрессии для случая, когда вам придется иметь дело с 3-го вечеринки и использовать стандартные функции в вашем собственном коде.
Fseeko и аналогичные команды работают с большой поддержкой файлов, поэтому нет необходимости в FSEEKO64 и т. Д. Apple Man Page