Wie kann ich unter Darwin einen großen Support für die Datei aktivieren?
-
25-09-2019 - |
Frage
Ich habe eine C -Anwendung, die ich für Mac OS X 10.6.4 kompilieren möchte:
$ uname -v
Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386
Mein gcc
ist wie folgt:
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
Mein Makefile
ist wie folgt:
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
Das Problem ist, dass meine Bewerbung Anrufe tätigt fseeko64
und fopen64
, und verwendet die off64_t
Geben Sie für Offsets ein. Wenn ich meine Bewerbung zusammenstelle, bekomme ich die folgenden Warnungen und Fehler:
$ 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
Mein Code erstellt unter Linux ohne Fehler. Welche Änderungen kann ich am Quellcode vornehmen, um beim Erstellen unter Darwin große Dateiunterstützung hinzuzufügen?
Lösung
In der Darwin-Datei ist I/A standardmäßig 64-Bit (zumindest 10,5), dies gerade gefunden, indem Sie in/usr/inklusive: Inklusive:
sys/_types.h:typedef __int64_t __darwin_off_t;
unistd.h:typedef __darwin_off_t off_t;
Alles was Sie tun müssen, ist so etwas wie
#ifdef __APPLE__
# define off64_t off_t
# define fopen64 fopen
...
#endif
Andere Tipps
Diese Frage hat zwar eine up-gewählte anerkannte Antwort, die funktioniert, denke ich, dass die Lösung etwas irreführend ist. Anstatt etwas zu reparieren Es ist immer besser, es zu vermeiden, es später zu reparieren.
Zum Beispiel für die fopen64
Funktion der GNU C -Bibliothek Dokumente sagen:
Wenn die Quellen mit kompiliert werden
_FILE_OFFSET_BITS == 64
Auf einer 32 -Bit -Maschine Diese Funktion ist unter dem Namen verfügbarfopen
und ersetzt so transparent die alte Schnittstelle.
Sie können einfach dieselbe Funktion verwenden fopen
Auf Systemen, die standardmäßig 64-Bit-E/A unterstützen, können Sie die festlegen _FILE_OFFSET_BITS=64
Fahnen Sie auf 32-Bit, ohne dass Schreiben neu definiert werden muss. Das gleiche gilt für Typen wie off64_t
vs. off_t
.
Speichern Sie die Neudefinien für den Fall, wenn Sie sich mit Quellen der Drittanbieter befassen und Standardfunktionen in Ihrem eigenen Code verwenden.
Die FSEOKO und ähnliche Befehle funktionieren mit großer Dateiunterstützung, sodass der FSEOKO64 usw. nicht erforderlich ist Apple Man Seite