¿Cómo habilitar el soporte de archivos grandes en Darwin?
-
25-09-2019 - |
Pregunta
Tengo una aplicación C que estoy intentando compilar para 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
Mi gcc
es como sigue:
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
Mi Makefile
es como sigue:
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
El problema es que mi aplicación hace llamadas a fseeko64
y fopen64
, y usa el off64_t
Escriba para compensaciones. Cuando compilo mi aplicación, recibo las siguientes advertencias y errores:
$ 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
Mi código se construye sin errores en Linux. ¿Qué cambios puedo hacer al código fuente para agregar soporte de archivos grande al construir en Darwin?
Solución
En el archivo Darwin, la E/S es de 64 bits de forma predeterminada (al menos 10.5), acabo de encontrar esto por Greping en/USR/incluir:
sys/_types.h:typedef __int64_t __darwin_off_t;
unistd.h:typedef __darwin_off_t off_t;
Entonces, todo lo que necesitas hacer es algo como
#ifdef __APPLE__
# define off64_t off_t
# define fopen64 fopen
...
#endif
Otros consejos
Si bien esta pregunta tiene una respuesta aceptada en votación que funciona, creo que la solución es un poco engañosa. En lugar de arreglar algo Siempre es mejor evitar tener que arreglarlo más tarde en primer lugar..
Por ejemplo para el fopen64
función de la Biblioteca GNU C Los documentos dicen:
Si las fuentes se compilan con
_FILE_OFFSET_BITS == 64
en una máquina de 32 bits Esta función está disponible bajo el nombrefopen
y, por lo tanto, reemplaza transparentemente la antigua interfaz.
Puedes usar la misma función fopen
en sistemas que admiten E/S de 64 bits de forma predeterminada y puede establecer el _FILE_OFFSET_BITS=64
Marcar en 32 bits sin la necesidad de escribir redefinidos. Lo mismo ocurre con los tipos como off64_t
vs. off_t
.
Guarde las redefiniciones para el caso cuando tenga que tratar con fuentes de terceros y use funciones estándar en su propio código.
El fseeko y los comandos similares funcionan con soporte de archivo grande, por lo que no es necesario que el Fseeko64, etc. Página de Apple Man