Comment activer un large soutien de fichiers sous Darwin?
-
25-09-2019 - |
Question
J'ai une application C Je suis en train de compiler pour 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
Mon gcc
est la suivante:
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
Mon Makefile
est la suivante:
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 fait appel à fseeko64
et fopen64
, et utilise le type de off64_t
pour les compensations. Quand je compile ma demande, je reçois les avertissements et les erreurs suivantes:
$ 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 construit sans erreurs sous Linux. Quels sont les changements que je peux apporter au code source pour ajouter un large soutien de fichiers lors de la construction sous Darwin?
La solution
Darwin fichier E / S est de 64 bits par défaut (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
Autres conseils
Bien que cette question a une réponse acceptée en-voté, ce qui fonctionne, je pense que la solution est un peu trompeur. Au lieu de fixer quelque chose il est toujours préférable d'éviter d'avoir à corriger plus tard en premier lieu .
Par exemple, pour la fonction fopen64
la GNU C Bibliothèque de docs disent:
Si les sources sont compilées avec
_FILE_OFFSET_BITS == 64
sur la machine 32 bits Cette fonction est disponible sous le nomfopen
et ainsi transparente remplace l'ancienne interface .
Vous pouvez simplement utiliser la même fonction fopen
sur les systèmes qui prennent en charge 64 bits d'E / S par défaut 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 comme off64_t
par rapport à off_t
.
Save the Redéfinit pour le cas où vous avez à traiter avec des sources 3ème partie et utiliser les fonctions standard dans votre propre code.
Les fseeko et les commandes similaires fonctionnent avec un grand support de fichiers, donc pas besoin pour le fseeko64 etc page de manuel d'Apple