大文件支持C语言编程不工作(Large file support not working in C

2019-07-18 18:28发布

我试图编译一个共享对象(即最终在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正确做的工作。

为什么大文件支持还是不行? 我究竟做错了什么?

Answer 1:

选项添加-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标志与开放的大文件进行操作。

希望这可以帮助。



Answer 2:

使用fseeko和ftello。 不FSEEK和FTELL。 当然不是,在它的名字64的任何功能。



Answer 3:

FSEEK和FTELL采取的int是32位的,因此它投了,你失去解决空间大于4GB的能力。 而是使用fseeko64ftello64内搭一件long



文章来源: Large file support not working in C programming
标签: c large-files