如何解决有关大文件支持的兼容性问题?

时间:2008-10-29 20:12:40

标签: c large-file-support

使用off_t作为一个函数(搜索)的参数的库。库和应用程序编译方式不同,一个关闭大文件支持,另一个文件支持大文件。这种情况导致奇怪的运行时错误,因为两者都不同地解释off_t。库如何在运行时检查应用程序的off_t大小?或者是否有其他解决方案,以便至少用户获得有意义的错误?

编辑:库(用c和autoconf编程)已经存在,一些第三方应用程序使用它。可以使用大文件支持(默认情况下通过AC_SYS_LARGEFILE)编译库。它是多平台的,不仅仅是linux。如何检测/防止LFS中的更改会破坏已安装的应用程序?

3 个答案:

答案 0 :(得分:2)

您可以向库中添加API以返回sizeof(off_t),然后从客户端进行检查。或者,库可能要求每个应用程序提供API以便成功链接:

LIBRARY.C:

size_t lib_get_off_t_size (void)
{
    return (sizeof(off_t));
}

client.c(init_function):

if (lib_get_off_t_size() != sizeof(off_t) {
    printf("Oh no!\n");
    exit();
}

如果库有一个init函数,那么你可以将检查放在那里,但是客户端必须提供API以获得其off_t的大小,这通常不是库的工作方式。

答案 1 :(得分:1)

在Linux上,当编译库并打开大文件支持时,off_t被定义为与off64_t相同。因此,如果库是使用大文件支持编译的库,则可以将其界面更改为始终使用off64_t而不是off_t(这可能需要_LARGEFILE64_SOURCE)并完全避免此问题。

您还可以检查是否正在使用大文件支持编译应用程序(通过查看是否未定义_FILE_OFFSET_BITS32)并拒绝编译(使用#error)它的编译方式错误;请参阅/usr/include/features.hFeature Test Macros

答案 2 :(得分:0)

如前所述,图书馆将无法知道如何编译应用程序(作为库的客户端),但反过来必须工作。此外,我认为你在谈论动态链接,因为静态链接肯定不会在相同的构建时间有不同的开关。

类似于“Andrew Johnson”已经给出的答案,该库可以提供一种方法来查明它是否是使用大文件支持编译的。知道这样的构建时间切换主要是用C中的定义完成的,这可能看起来像这样:

//in library:
BOOL isLargeFileSupport (void)
{
#ifdef LARGE_FILE_SUPPORT
    return TRUE;
#else
    return FALSE;
#endif
}

然后,应用程序知道如何处理该lib报告的文件大小,或者在不兼容时拒绝工作:

//in application
BOOL bLibLFS = lib_isLargeFileSupport();
BOOL bAppLFS = FALSE;
#ifdef LARGE_FILE_SUPPORT
    bAppLFS = TRUE;
#endif

if (bLibLFS != bAppLFS)
    //incompatible versions, bail out
    exit(0);