如何在Darwin下启用大文件支持?

时间:2010-10-23 10:14:28

标签: c linux fopen darwin large-file-support

我有一个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

问题是我的应用程序调用了fseeko64fopen64,并使用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下构建时,我可以对源代码进行哪些更改以添加大文件支持?

3 个答案:

答案 0 :(得分:10)

在Darwin文件中,I / O默认为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

答案 1 :(得分:4)

虽然这个问题有一个最终投票接受的答案,但我觉得解决方案有点误导。而不是修复某些东西它总是更好,以避免以后在第一时间修复它

例如,对于fopen64函数,GNU C Library文档说:

  

如果在32位机器上使用_FILE_OFFSET_BITS == 64编译源代码,则此功能在名称fopen下可用,因此透明地替换旧接口

默认情况下,您可以在支持64位I / O的系统上使用相同的函数fopen,并且可以在32位上设置_FILE_OFFSET_BITS=64标志,而无需根据需要重新定义。 off64_toff_t等类型也是如此。

当您必须处理第三方来源并在您自己的代码中使用标准功能时,请保留重新定义的案例。

答案 2 :(得分:1)

fseeko和类似的命令可以支持大文件,所以不需要fseeko64等Apple man page