2010-10-23 58 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

相關問題