سؤال

لدي تطبيق 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top