如何启用达尔文下的大文件支持?

我有一个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_ttypes作为偏移量。 当我编译我的应用程序时,我得到以下警告和错误:

 $ 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下构build时,我可以对源代码进行哪些修改来添加大文件支持?

在Darwin文件I / O默认情况下是64位(至少10.5),通过grep在/ 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 

虽然这个问题有一个投票接受的答案,我认为这个解决方案有点误导。 而不是固定的东西,总是要避免在第一时间修复它

例如对于GNU C库文档中的fopen64函数来说:

如果在32位计算机上使用_FILE_OFFSET_BITS == 64编译源,则该函数在名称fopen下可用,因此可以透明地替换旧接口

您可以在默认支持64位I / O的系统上使用相同的函数fopen ,并且可以在32位上设置_FILE_OFFSET_BITS=64标志,而无需重新定义写入。 像off64_toff_t类型一样。

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

fseeko和类似的命令与大文件支持工作,所以不需要fseeko64等苹果手册页