我有一个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
问题是我的应用程序调用fseeko64
和fopen64
,并使用off64_t
types作为偏移量。 当我编译我的应用程序时,我得到以下警告和错误:
$ 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_t
和off_t
类型一样。
当您必须处理第三方来源并在自己的代码中使用标准功能时,保存重新定义的情况。
fseeko和类似的命令与大文件支持工作,所以不需要fseeko64等苹果手册页