我有一个问题,编译代码到android native。我在编译期间遇到此错误:
'struct stat' has no member named 'st_ctim'
在struct stat的头文件中,struct被称为'st_ctime'(最后注意'e')
有没有办法可以编译代码而不修改它? 是否有一个版本的android本机API附带一个struct stat(stat.h),其中包含成员'st_ctim'而不是'st_ctime'?
我正在针对Android本机API级别26进行编译。到目前为止,我已经看到在API级别8,9,23中存在同样的问题。
我用st_ctim报告问题,但每个其他成员都以'e'结尾(st_atime,st_mtime)
为了清楚起见,为什么libc struct stat和android native struct stat之间存在差异?
答案 0 :(得分:1)
如果您使用的是现代版NDK,那么您将拥有一个现代struct stat
:https://android.googlesource.com/platform/bionic/+/master/libc/include/sys/stat.h
请注意,您需要使用NDK的unified headers来获取最新的标头。这是r15中的默认值,但是选择加入r14。
答案 1 :(得分:0)
st_ctim是stat的较新成员,它包含nanosec精确时间(struct timespec)。不幸的是,android没有那个。这是lstat(Linux机器)手册的摘录:
struct stat {
/* I stripped several members here (st_mode, etc.) */
/* Since Linux 2.6, the kernel supports nanosecond
precision for the following timestamp fields.
For the details before Linux 2.6, see NOTES. */
struct timespec st_atim; /* time of last access */
struct timespec st_mtim; /* time of last modification */
struct timespec st_ctim; /* time of last status change */
#define st_atime st_atim.tv_sec /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};
较旧的内核和较旧的标准不支持纳秒 时间戳字段。相反,有三个时间戳 田-st_atime的, st_mtime和st_ctime-typed为time_t,记录时间戳,精度为1秒。
从内核2.5.48开始,stat结构支持三个文件时间戳字段的纳秒分辨率。纳秒 的组成部分 如果定义了合适的特征测试宏,则每个时间戳都可以通过st_atim.tv_nsec形式的名称获得。 纳秒时间戳 在POSIX.1-2008中标准化,并且从版本2.12开始,如果_POSIX_C_SOURCE是,则glibc公开纳秒组件名称 使用值200809L或更大值定义,或_XOPEN_SOURCE定义值700或更大。最多包括glibc 2.19, 如果定义了_BSD_SOURCE或_SVID_SOURCE,则还定义纳秒组件的定义。如果没有上述宏 如果定义了纳秒值,则使用st_atimensec形式的名称公开纳秒值。
所以你的代码依赖于这个新功能,我认为你必须使用st_ctime而不是st_ctim来修改它。