带有struct stat的Android NDK编译错误

时间:2017-06-17 10:15:01

标签: android c++ struct android-ndk

我有一个问题,编译代码到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之间存在差异?

2 个答案:

答案 0 :(得分:1)

如果您使用的是现代版NDK,那么您将拥有一个现代struct stathttps://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来修改它。