كيفية تمكين دعم الملفات الكبير تحت داروين؟
-
25-09-2019 - |
سؤال
لدي تطبيق C أحاول تجميعه لنظام التشغيل 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
لي gcc
على النحو التالي:
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
لي Makefile
على النحو التالي:
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
المشكلة هي أن طلبي يقوم بالمكالمات fseeko64
و fopen64
, ويستخدم off64_t
اكتب الإزاحة. عندما أقوم بتجميع طلبي ، أحصل على التحذيرات والأخطاء التالية:
$ 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
رمز بلدي يبني بدون أخطاء تحت لينكس. ما هي التغييرات التي يمكنني إجراؤها على الكود المصدري لإضافة دعم ملفات كبير عند البناء تحت داروين؟
المحلول
على ملف Darwin I/O هو 64 بت افتراضيًا (10.5 على الأقل) ، فقط وجدت هذا من خلال Grepping في/usr/include:
sys/_types.h:typedef __int64_t __darwin_off_t;
unistd.h:typedef __darwin_off_t off_t;
لذا كل ما عليك فعله هو شيء مثل
#ifdef __APPLE__
# define off64_t off_t
# define fopen64 fopen
...
#endif
نصائح أخرى
على الرغم من أن هذا السؤال له إجابة مقبولة مقبولة والتي تعمل ، أعتقد أن الحل مضلل بعض الشيء. بدلاً من إصلاح شيء ما من الأفضل دائمًا تجنب الاضطرار إلى إصلاحه لاحقًا في المقام الأول.
على سبيل المثال ل fopen64
تعمل مكتبة GNU C. تقول المستندات:
إذا تم تجميع المصادر مع
_FILE_OFFSET_BITS == 64
على آلة 32 بت هذه الوظيفة متوفرة تحت الاسمfopen
ويحل محل الواجهة القديمة بشفافية.
يمكنك فقط استخدام نفس الوظيفة fopen
على الأنظمة التي تدعم I/O 64 بت افتراضيًا ويمكنك تعيين ملف _FILE_OFFSET_BITS=64
العلم على 32 بت دون الحاجة إعادة تعريف إعادة تعريف على الإطلاق. الشيء نفسه ينطبق على أنواع مثل off64_t
ضد. off_t
.
احفظ إعادة تعريف للحالة عندما يتعين عليك التعامل مع مصادر الطرف الثالث واستخدام الوظائف القياسية في الكود الخاص بك.
تعمل Fseeko والأوامر المماثلة مع دعم ملفات كبيرة ، لذا لا حاجة إلى FSEEKO64 وما إلى ذلك صفحة Apple Man