ダーウィンの下で大きなファイルサポートを有効にする方法は?
-
25-09-2019 - |
質問
私はMac OS X 10.6.4のためにコンパイルしようとしているCアプリケーションを持っています:
$ 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
私のコードは、Linuxの下でエラーなしで構築されます。ダーウィンの下に構築するときに大きなファイルサポートを追加するために、ソースコードにどのような変更を加えることができますか?
解決
ダーウィンのファイルでは、デフォルトでは64ビット(少なくとも10.5)で、これを見つけました/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
デフォルトで64ビットI/Oをサポートするシステムで、 _FILE_OFFSET_BITS=64
必要のない32ビットにフラグを立て、書き込みをまったく再定義します。同じことが次のようなタイプにも当てはまります off64_t
vs。 off_t
.
サードパーティのソースに対処し、独自のコードで標準機能を使用する必要がある場合、ケースのRedefinesを保存します。
fseekoと同様のコマンドは大きなファイルサポートで動作するため、fseeko64などは必要ありません Apple Manページ