2010-10-23 14 views
8

Ho un'applicazione C Sto cercando di compilare per Mac OS X 10.6.4:Come abilitare il supporto di file di grandi dimensioni con Darwin?

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

mio gcc è la seguente:

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

mio Makefile è la seguente:

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 

Il problema è che la mia applicazione effettua chiamate a fseeko64 e fopen64 e utilizza.tipo per offset. Quando compilo la mia applicazione ottengo i seguenti avvertimenti ed errori:

$ 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 

Il mio codice si costruisce senza errori sotto Linux. Quali modifiche posso apportare al codice sorgente per aggiungere un supporto di file di grandi dimensioni quando si costruisce sotto Darwin?

risposta

10

Su Darwin file di I/O è a 64 bit per default (10,5 almeno), appena trovato questo grep in/usr/include:

sys/_types.h:typedef __int64_t __darwin_off_t; 

unistd.h:typedef __darwin_off_t  off_t; 

Quindi, tutto quello che dovete fare è qualcosa di simile a

#ifdef __APPLE__ 
# define off64_t off_t 
# define fopen64 fopen 
... 
#endif 
+0

Grazie, questo è stato perfetto. –

+0

@AlexReynolds Non lo definirei perfetto, vedere la mia risposta. – aergistal

0

La comandi simili fseeko e lavorare con il supporto di file di grandi dimensioni quindi non è necessario per il fseeko64 ecc Apple man page

2

Mentre questa domanda ha un up-votato risposta accettato che funziona io pensa che la soluzione sia un po 'fuorviante. Invece di riparare qualcosa è sempre meglio evitare di doverlo risolvere in un secondo momento,.

Ad esempio per la funzione fopen64 le GNU C Library documenti dicono:

Se le sorgenti sono compilate con _FILE_OFFSET_BITS == 64 su una macchina 32 bit questa funzione è disponibile con il nome fopen e così trasparente sostituisce la vecchia interfaccia .

si può semplicemente utilizzare la stessa funzione fopen sui sistemi che supportano 64 bit I/O di default ed è possibile impostare il flag _FILE_OFFSET_BITS=64 a 32 bit senza la necessità di scrittura ridefinisce a tutti. Lo stesso vale per tipi come off64_t rispetto a off_t.

Salvare le ridefinizioni per il caso quando si ha a che fare con fonti di terze parti e utilizzare le funzioni standard nel proprio codice.

+0

Questa dovrebbe essere la risposta accettata. Questo è il modo giusto per risolvere questo problema. – Sam

+0

L'ho approfondito e sebbene questa dovrebbe essere la risposta accettata per le piattaforme non Darwin, su Darwin hanno reso le funzioni dei file a 64 bit, e '_FILE_OFFSET_BITS' e' _LARGEFILE64_SOURCE' non esistono. Quindi la risposta accettata è probabilmente il modo migliore per risolvere un problema di portabilità. – Sam

Problemi correlati