我正在 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
但在评论中有人提到了这种解决方法:
今天,我在长期支持分支“kirkstone”上构建映像时遇到了同样的问题。