首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Darwin下启用大文件支持?

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

Stack Overflow用户
提问于 2010-10-23 18:14:28
回答 3查看 7.6K关注 0票数 9

我正在尝试为Mac OS X 10.6.4编译一个C应用程序:

代码语言:javascript
复制
$ 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如下:

代码语言:javascript
复制
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)

我的Makefile如下:

代码语言:javascript
复制
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类型作为偏移量。当我编译我的应用程序时,我得到以下警告和错误:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-23 18:26:37

在Darwin文件中,默认情况下I/O是64位的(至少是10.5),这是通过在/usr/include中输入以下内容找到的:

代码语言:javascript
复制
sys/_types.h:typedef __int64_t  __darwin_off_t;

unistd.h:typedef __darwin_off_t     off_t;

所以你需要做的就是像这样

代码语言:javascript
复制
#ifdef __APPLE__
#  define off64_t off_t
#  define fopen64 fopen
...
#endif
票数 10
EN

Stack Overflow用户

发布于 2015-09-05 16:53:46

虽然这个问题有一个被广泛接受的答案,但我认为这个解决方案有点误导。与修复某些东西相比,避免在一开始就修复它总是更好的。

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

如果源代码是在32位机器上用_FILE_OFFSET_BITS == 64编译的,则此函数以的名称提供,因此可以透明地替换旧的接口。

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

保留重新定义,以防您必须处理第三方源代码并在您自己的代码中使用标准函数。

票数 4
EN

Stack Overflow用户

发布于 2010-10-23 18:26:14

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4003479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档