我试图编译一个共享对象(即最终在Python使用ctypes的)。 用于建立该对象的命令行是:
gcc -Wall -O3 -shared -Wl,-soname,borg_stream -lm -m128bit-long-double -fPIC \
-D_FILE_OFFSET_BITS=64 -o borg_stream.so data_stream.c data_types.c \
file_operations.c float_half.c channels.c statistics.c index_stream.c helpers.c
图书馆正确建立在一个32位操作系统和它做什么,它需要对小文件。 然而,它失败了大于4GB的文件的单元测试。 此外,它设置errno为EOVERFLOW做一个FSEEK / FTELL时。 不过,如果我的printf的sizeof(off_t),它返回8.如果我删除-D_FILE_OFFSET_BITS=64
,则它打印4,所以它看起来像-D_FILE_OFFSET_BITS
正确做的工作。
为什么大文件支持还是不行? 我究竟做错了什么?
选项添加-D_LARGE_FILE_SOURCE=1
至GCC编译。
fseek64
是C函数。 为了使其可你必须包括系统头文件之前定义_FILE_OFFSET_BITS = 64。 这将或多或少定义fseek
为实际行为fseek64
。 或者你可以做到这一点的编译参数如GCC -D_FILE_OFFSET_BITS = 64,你已经在做。
http://www.suse.de/~aj/linux_lfs.html有在Linux上大文件支持一个良好的信息:
与编译程序gcc -D_FILE_OFFSET_BITS=64
。 这将迫使所有的文件访问调用使用64位的变体。 几种类型也随之变化,如off_t
变得off64_t
。 这是很重要的,始终使用正确的类型和不使用如int
而不是off_t
在C代码。 为了与其他平台的可移植性,你应该使用getconf LFS_CFLAGS
将返回-D_FILE_OFFSET_BITS=64
在Linux平台上,但可能用于例如在Solaris上别的东西回报。 对于链接,你应该使用经报道的链接标志getconf LFS_LDFLAGS
。 在Linux系统中,你不需要特殊的链接标志。 定义_LARGEFILE_SOURCE
和_LARGEFILE64_SOURCE
。 有了这些定义可以使用LFS功能,如open64
直接。 使用O_LARGEFILE
标志与开放的大文件进行操作。
希望这可以帮助。
使用fseeko和ftello。 不FSEEK和FTELL。 当然不是,在它的名字64的任何功能。
FSEEK和FTELL采取的int
是32位的,因此它投了,你失去解决空间大于4GB的能力。 而是使用fseeko64
和ftello64
内搭一件long
。