2010-10-23 21 views
8

我有一个C程序我试图编译为Mac OS X 10.6.4:如何在Darwin下启用大文件支持?

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

回答

10

在达尔文的文件I/O是64位的默认(10.5至少),刚刚发现这个由grepping/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 
+0

谢谢,这很完美。 – 2010-10-23 10:37:38

+0

@AlexReynolds我不会称之为完美,请参阅我的答案。 – aergistal 2015-09-05 08:55:19

0

的fseeko和类似的命令具有大文件支持工作,所以没有必要为位置fseeko64等Apple man page

2

尽管这个问题有一个向上投票接受答案,我的作品认为解决方案有点误导。不要固定东西最好避免在第一个地方以后修复​​它。

例如,对于fopen64功能GNU C Library文档说:

如果源代码是在32位机器_FILE_OFFSET_BITS == 64编译这个功能的名字fopen下可用,因此透明地取代了旧的接口

你可以使用同样的功能fopen上,默认情况下支持64位I/O系统,并重新定义所有你可以设置32位的_FILE_OFFSET_BITS=64标志,而不需要写。类似off64_toff_t类似。

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

+0

这应该是被接受的答案。这是解决这个问题的正确方法。 – Sam 2016-07-07 01:08:49

+0

我对此进行了深入研究,虽然这应该是非达尔文平台的公认答案,但在达尔文,他们已将文件函数设置为64位,并且不存在“_FILE_OFFSET_BITS”和“_LARGEFILE64_SOURCE”。所以接受的答案可能是解决这种可移植性问题的最佳方法。 – Sam 2016-07-07 01:35:36

相关问题