9

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

問題は、私のアプリケーションがfseeko64andを呼び出し、オフセット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 でエラーなくビルドされます。Darwin でビルドするときに大きなファイルのサポートを追加するには、ソース コードにどのような変更を加えることができますか?

4

3 に答える 3

10

Darwin では、ファイル I/O はデフォルトで 64 ビット (少なくとも 10.5) ですが、/usr/include で grep してこれを見つけました:

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
于 2010-10-23T10:26:36.790 に答える
4

この質問には賛成票が投じられた受け入れられた回答がありますが、解決策は少し誤解を招くと思います。何かを修正する代わりに、最初から後で修正する必要がないようにすることを常にお勧めします

たとえば、fopen64関数の場合、GNU C ライブラリのドキュメントには次のように書かれています。

_FILE_OFFSET_BITS == 64ソースが32 ビット マシンでコンパイルされている場合、この関数は名前で使用できるfopenため、透過的に古いインターフェイスを置き換えます

fopenデフォルトで 64 ビット I/O をサポートするシステムで同じ関数を使用するだけ_FILE_OFFSET_BITS=64で、書き込みの再定義をまったく必要とせずに 32 ビットでフラグを設定できます。off64_tvs.のような型についても同じことが言えoff_tます。

サードパーティのソースを処理し、独自のコードで標準関数を使用する必要がある場合に備えて、再定義を保存します。

于 2015-09-05T08:53:46.023 に答える
1

fseeko および同様のコマンドは大きなファイルのサポートで動作するため、fseeko64 などのApple のマニュアル ページは必要ありません。

于 2010-10-23T10:26:13.560 に答える