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?

¿Fue útil?

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 nombre fopen 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top