Domanda

Ho un'applicazione C che sto cercando di compilare per 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

Mio gcc è come segue:

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

Mio Makefile è come segue:

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 fa chiamate a fseeko64 e fopen64, e usa il off64_t Digita per offset. Quando compilo la mia applicazione ricevo 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 basa senza errori sotto Linux. Quali modifiche posso apportare al codice sorgente per aggiungere un supporto di file di grandi dimensioni durante la costruzione in Darwin?

È stato utile?

Soluzione

Sul file Darwin I/O è 64 bit per impostazione predefinita (almeno 10.5), ho appena trovato questo tramite Grepping in/USR/Include:

sys/_types.h:typedef __int64_t  __darwin_off_t;

unistd.h:typedef __darwin_off_t     off_t;

Quindi tutto ciò che devi fare è qualcosa di simile

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

Altri suggerimenti

Mentre questa domanda ha una risposta accettata con votazione che funziona, penso che la soluzione sia un po 'fuorviante. Invece di sistemare qualcosa È sempre meglio evitare di doverlo risolvere più tardi in primo luogo.

Ad esempio per il fopen64 funzione il Biblioteca GNU C. I dottori dicono:

Se le fonti vengono compilate con _FILE_OFFSET_BITS == 64 Su una macchina da 32 bit Questa funzione è disponibile sotto il nome fopen e sostituisce così trasparentemente la vecchia interfaccia.

Puoi semplicemente usare la stessa funzione fopen sui sistemi che supportano I/O a 64 bit per impostazione predefinita e puoi impostare il _FILE_OFFSET_BITS=64 Flag su 32 bit senza la necessità di scrivere ridefinizioni. Lo stesso vale per tipi come off64_t vs. off_t.

Salva le ridefinizioni per il caso in cui è necessario gestire fonti di terze parti e utilizzare funzioni standard nel tuo codice.

I comandi Fseeko e simili funzionano con un supporto di file di grandi dimensioni, quindi non è necessario per FseekO64 ecc. Pagina di Apple Man

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top