我正在使用Yocto中Linux构建的32位版本。我想在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
文件中的代码报告了一个错误:
_TIME_BITS=64只允许与_FILE_OFFSET_BITS=64一起使用
所以图像不会生成,因为zlib
不想构建。为什么不能同时设置D_LARGEFILE64_SOURCE=1
和D_FILE_OFFSET_BITS=64
标志?
发布于 2023-04-24 11:02:16
仍然有一个悬而未决的问题是:https://github.com/madler/zlib/issues/447
但在评论中有人提到了这样的解决办法:
今天,当我在长期支持部门"kirkstone“上建立一个形象时,我也谈到了同样的问题。
https://unix.stackexchange.com/questions/692377
复制相似问题