c - 如何使用 mingw/autotools 在 Windows 上启用大文件支持?

标签 c linux windows mingw autotools

正如标题所说,我正在尝试找到一种方法来在使用自动工具的项目上启用大文件支持。我在configure.ac 文件中使用AC_SYS_LARGEFILE 宏,它在64 位Linux(默认情况下)和32 位Linux 上运行良好。现在我移植了该项目,以便它可以使用 mingw 在 Windows(32 位)上进行编译,但遗憾的是 AC_SYS_LARGEFILE 不起作用(例如 off_t 是 4 个字节,而在 Linux 上在 32 位和 64 位中都是 8 个字节)并且 fopen/fstat 不会被 fopen64/fstat64 取代)。

这是一个测试用例,我可以在其中重现其中一个问题(off_t 是 4 个字节):

配置.ac

AC_INIT([testcase], [1.0.0], [<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5130353c383f113429303c213d347f323e3c" rel="noreferrer noopener nofollow">[email protected]</a>])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
# Support for large files in 32bit systems
AC_SYS_LARGEFILE
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

Makefile.am

ACLOCAL_AMFLAGS=-I m4

bin_PROGRAMS=testcase
testcase_SOURCES=testcase.c
testcase_CFLAGS= -std=gnu99 -O2

测试用例.c

#include "config.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("sizeof off_t: %i bytes\n", sizeof(off_t));
    return 0;
}

为了编译/运行测试用例,我使用以下命令:

mkdir m4
autoreconf --install
./configure
make
./testcase

64 位 Linux 上的输出(使用 gcc/autotools)

sizeof off_t: 8 bytes

32位Linux上的输出(使用gcc/autotools)

sizeof off_t: 8 bytes

Windows 7 32位上的输出(使用mingw-get准备环境):

sizeof off_t: 4 bytes

关于我可以在配置脚本中添加/修改什么以便我可以在两个平台上获得大文件支持的任何想法?使用 mingw/autotools 可以吗?

最佳答案

切换到 mingw-w64 项目,尽管名字如此,但它有一个 32 位编译器,具有适当的大文件支持。我不确定这是否是原始 mingw32 项目的错误或限制,因为我在其他项目中找不到此问题的根源。

使用 host=i686-pc-mingw32 配置输出

...
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... unknown
checking for _LARGE_FILES value needed for large files... unknown
checking that generated files are newer than configure... done
...

使用 host=i686-w64-mingw32 配置输出

...
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... 64
checking that generated files are newer than configure... done
...

第二个生成一个 32 位可执行文件,该可执行文件输出正确的值。简而言之:问题出在编译器中,而不是在自动工具中。

我仍然对原始 mingw32 为什么有这个问题以及这个问题是否可以解决的答案感兴趣。

关于c - 如何使用 mingw/autotools 在 Windows 上启用大文件支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18908557/

相关文章:

c - 如何将 3x3 的卷积核与图像相乘

linux - kubectl顶级节点报告的内存利用率高于Linux系统命令

windows - Powershell 启动 notepad.exe 并且命令窗口启动并消失

Windows 相当于 Unix "find"命令?

c - 如何检查 BDS/北斗卫星系统的 BCH(15,11,1) 代码/校验和

c - 为什么这会给我一个逻辑错误?

c - 根据输入执行一段代码

php - UTF-8贯穿始终

python - 通过 LAN 发送文件的快速可靠的多平台方式

sql - Postgres 是否会在更新时重写整行?