gpt4 book ai didi

c - 大文件支持在 C 编程中不起作用

转载 作者:行者123 更新时间:2023-12-04 11:26:17 25 4
gpt4 key购买 nike

我正在尝试编译一个共享对象(最终在带有 ctypes 的 Python 中使用)。用于构建对象的命令行是:

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 的文件的单元测试。此外,它在执行 fseek/ftell 时将 errno 设置为 EOVERFLOW。但是,如果我 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使用 open 标志对大文件进行操作。

希望这可以帮助。

关于c - 大文件支持在 C 编程中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14533836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com