在32位系统上,ftell如果以二进制模式打开的文件的当前位置指示符超过2GB点,会返回什么?在C99标准中,这是未定义的行为,因为ftell必须返回一个long int(最大值为2**31-1)?
我正在尝试编译一个共享对象(最终在带有 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
Run Code Online (Sandbox Code Playgroud)
该库在 32 位操作系统上正确构建,并且可以为小文件执行所需的操作。但是,它无法通过大于 4GB 的文件的单元测试。此外,它在执行 fseek/ftell 时将 errno 设置为 EOVERFLOW。但是,如果我 printf sizeof(off_t),它返回 8。如果我 remove -D_FILE_OFFSET_BITS=64,那么它打印 4。所以它似乎-D_FILE_OFFSET_BITS是正确地完成它的工作。
为什么大文件支持仍然不起作用?我究竟做错了什么?