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

9

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

12

在 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

@AlexReynolds 我不会说它完美,可以看看我的回答。 - aergistal

7
虽然这个问题有一个被赞同的可接受答案,但我认为这个解决方案有些误导人。与其修复某些东西,最好在一开始就避免需要修复它

例如,对于fopen64函数,GNU C Library文档如下所示:

如果在32位机器上使用_FILE_OFFSET_BITS == 64编译源代码,则此函数可用作fopen,因此可以透明地替换旧接口

您只需在默认支持64位I/O的系统上使用相同的fopen函数,您可以在32位上设置_FILE_OFFSET_BITS=64标志而无需编写重新定义。对于类型如off64_toff_t也是如此。

将重新定义保存给处理第三方源时,并在自己的代码中使用标准函数。

这应该是被接受的答案。这是修复此问题的正确方法。 - Sam
1
我进一步调查了这个问题,尽管对于非Darwin平台来说这应该是被接受的答案,但在Darwin上,文件函数已经变成了64位,并且 _FILE_OFFSET_BITS_LARGEFILE64_SOURCE 不存在。因此,被接受的答案可能是解决这种可移植性问题的最佳方法。 - Sam

1

fseeko和类似的命令支持大文件,因此不需要使用fseeko64等命令Apple man page


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接