正如标题所说,我试图找到一种方法来在使用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个字节):
configure.ac
AC_INIT([testcase], [1.0.0], [admin@example.com])
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
testcase.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吗?
答案 0 :(得分:2)
切换到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位可执行文件,输出正确的值。简而言之:问题出在编译器而不是autotools中。
我仍然对原来的mingw32有这个问题以及这个问题是否可以解决的答案感兴趣。