标志 D_FILE_OFFSET_BITS 和 D_LARGEFILE64_SOURCE 之间的关系

标志 D_FILE_OFFSET_BITS 和 D_LARGEFILE64_SOURCE 之间的关系

我正在 Yocto 中使用 32 位版本的 Linux 版本。我想添加对 2038 年之后时间戳的支持,因此在本地.conf文件中我添加了:

TARGET_CPPFLAGS += "-D_FILE_OFFSET_BITS=64"
TARGET_CPPFLAGS += "-D_TIME_BITS=64"

根据手册,第二个标志是使用第一个标志构建图像所必需的glibc。在其中一个 glibc 文件 ( features-time64.h) 中有以下代码片段:

#if defined _TIME_BITS
# if _TIME_BITS == 64
#  if ! defined (_FILE_OFFSET_BITS) || _FILE_OFFSET_BITS != 64
#   error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
#  elif __TIMESIZE == 32
#   define __USE_TIME_BITS64    1
#  endif
# elif _TIME_BITS == 32
#  if __TIMESIZE > 32
#   error "_TIME_BITS=32 is not compatible with __TIMESIZE > 32"
#  endif
# else
#  error Invalid _TIME_BITS value (can only be 32 or 64-bit)
# endif
#endif

在图像中,我有一个zlib程序,它D_LARGEFILE64_SOURCE=1默认设置了标志。代码中zlib有如下一段代码(gzguts.h):

#ifdef _LARGEFILE64_SOURCE
#  ifndef _LARGEFILE_SOURCE
#    define _LARGEFILE_SOURCE 1
#  endif
#  ifdef _FILE_OFFSET_BITS
#    undef _FILE_OFFSET_BITS
#  endif
#endif

D_LARGEFILE64_SOURCE=1,中的默认标志zlib会导致取消定义该FILE_OFFSET_BITS标志,并且文件中的上述代码features_time.h报告错误:

仅当 _FILE_OFFSET_BITS=64 时才允许 _TIME_BITS=64

因此图像不会构建,因为zlib不想构建。为什么我不能同时设置D_LARGEFILE64_SOURCE=1和标志?D_FILE_OFFSET_BITS=64我可以以某种方式解决这个问题吗?

答案1

Github 上仍然存在一个未解决的问题:https://github.com/madler/zlib/issues/447

但在评论中有人提到了这种解决方法:

https://stackoverflow.com/questions/72801397/glibc-build-with-flags-file-offset-bits-64-and-time-bits-64-fails/72854884#72854884

今天,我在长期支持分支“kirkstone”上构建映像时遇到了同样的问题。

相关内容