2010-10-23 16 views
8

J'ai une application C Je suis en train de compiler pour Mac OS X 10.6.4:Comment activer le support de fichiers volumineux sous 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 

Mon gcc se présente comme suit:

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

Mon Makefile se présente comme suit:

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 

Le problème est que mon application effectue des appels à fseeko64 et fopen64, et utilise le off64_t type pour les offsets. Lorsque je compile mon application, j'obtiens les avertissements et erreurs suivants:

$ 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 

Mon code se construit sans erreur sous Linux. Quels changements puis-je apporter au code source pour ajouter un support de fichier volumineux lors de la construction sous Darwin?

Répondre

10

Sur Darwin fichier E/S est par défaut 64 bits (10,5 au moins), vient de trouver cela en grepper dans/usr/include:

sys/_types.h:typedef __int64_t __darwin_off_t; 

unistd.h:typedef __darwin_off_t  off_t; 

donc, tout ce que vous devez faire est quelque chose comme

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

Merci, c'était parfait. –

+0

@AlexReynolds Je ne l'appellerais pas parfait, voir ma réponse. – aergistal

0

Les fseeko et les commandes similaires fonctionnent avec un grand support de fichiers, donc pas besoin pour le fseeko64 etc Apple man page

2

Bien que cette question a une mise voté réponse acceptée qui fonctionne I pense que la solution est un peu trompeuse. Au lieu de réparer quelque chose il est toujours préférable d'éviter d'avoir à le réparer plus tard en premier lieu.

Par exemple, pour la fonction fopen64 les GNU C Library docs disent:

Si les sources sont compilées avec _FILE_OFFSET_BITS == 64 sur une machine cette fonction 32 bits est disponible sous le nom fopen et remplace de façon transparente l'ancienne interface .

Vous pouvez simplement utiliser la même fonction fopen sur les systèmes qui prennent en charge par défaut E/S 64 bits et vous pouvez définir le drapeau _FILE_OFFSET_BITS=64 sur 32 bits sans écriture de besoin redessine tout. La même chose vaut pour les types off64_t par rapport à off_t. Enregistrez les redéfinitions pour le cas où vous devez traiter avec des sources tierces et utiliser les fonctions standard dans votre propre code.

+0

Cela devrait être la réponse acceptée. C'est la bonne façon de résoudre ce problème. – Sam

+0

J'ai regardé dans ce plus et bien que cela devrait être la réponse acceptée pour les plates-formes non-Darwin, sur Darwin ils ont fait les fonctions de fichier 64 bits, et '_FILE_OFFSET_BITS' et' _LARGEFILE64_SOURCE' n'existent pas. Donc, la réponse acceptée est probablement la meilleure façon de résoudre un tel problème de portabilité. – Sam