Ale*_*lds 9 c linux fopen darwin large-file-support
我有一个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
Run Code Online (Sandbox Code Playgroud)
我的gcc
情况如下:
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
Run Code Online (Sandbox Code Playgroud)
我的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
Run Code Online (Sandbox Code Playgroud)
问题是我的应用程序调用fseeko64
和fopen64
,并使用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
Run Code Online (Sandbox Code Playgroud)
我的代码在Linux下构建没有错误.在Darwin下构建时,我可以对源代码进行哪些更改以添加大文件支持?
moj*_*uba 10
在Darwin文件中,默认情况下I/O是64位(至少10.5),只需在/ usr/include中找到它:
sys/_types.h:typedef __int64_t __darwin_off_t;
unistd.h:typedef __darwin_off_t off_t;
Run Code Online (Sandbox Code Playgroud)
所以你需要做的就是这样
#ifdef __APPLE__
# define off64_t off_t
# define fopen64 fopen
...
#endif
Run Code Online (Sandbox Code Playgroud)
虽然这个问题有一个已被投票接受的答案,但它有效,但我认为该解决方案有点误导。与其修复某些东西,不如首先避免稍后修复它。
例如,对于GNU C 库fopen64
文档中的函数来说:
如果源代码是
_FILE_OFFSET_BITS == 64
在 32 位机器上编译的,则该函数可以在该名称下使用fopen
,因此可以透明地替换旧接口。
fopen
您可以在默认支持 64 位 I/O 的系统上使用相同的函数,并且可以_FILE_OFFSET_BITS=64
在 32 位上设置标志,而根本不需要写入重新定义。off64_t
对于vs.等类型也是如此off_t
。
当您必须处理第三方源并在自己的代码中使用标准函数时,请保存重新定义。