我正在尝试编译一个共享对象(最终在带有 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是正确地完成它的工作。
为什么大文件支持仍然不起作用?我究竟做错了什么?
添加-D_LARGE_FILE_SOURCE=1gcc 编译选项。
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。因此,始终使用正确的类型并且不要在 C 代码中使用 egint而不是很重要off_t。为了与其他平台的可移植性,您应该使用getconf LFS_CFLAGS它会-D_FILE_OFFSET_BITS=64在 Linux 平台上返回,但可能会返回其他平台,例如在 Solaris 上。对于链接,您应该使用通过 报告的链接标志getconf LFS_LDFLAGS。在 Linux 系统上,您不需要特殊的链接标志。定义_LARGEFILE_SOURCE和_LARGEFILE64_SOURCE。通过这些定义,您可以open64直接使用 LFS 函数。使用O_LARGEFILE带有 open的标志对大文件进行操作。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
4814 次 |
| 最近记录: |