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?

War es hilfreich?

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ügbar fopen 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top