2017-06-17 25 views
0

我有一個問題,以編譯代碼到Android本機。我在編譯過程中出現此錯誤:Android NDK編譯錯誤與結構統計

'struct stat' has no member named 'st_ctim' 

在struct stat中的頭文件的結構被稱爲(最終注意到「E」)「st_ctime」

有沒有一種辦法可以編譯代碼沒有修改它? 是否有一個帶有包含成員'st_ctim'而不是'st_ctime'的struct stat(stat.h)的android本機API版本?

我正在針對Android本機API級別26進行編譯。到目前爲止,我已經看到在API級別8,9,23中存在相同的問題。

我要報告st_ctim的問題,但每一個其他成員有一個「e」(st_atime的,st_mtime)

爲了清楚目的結束,爲什麼會出現的libc結構統計和Android原生結構統計之間的差異?

+0

以及它是哪一種語言?不要爲不同語言的垃圾郵件標籤! – Olaf

+0

@Olaf這是語言C++,我有垃圾郵件嗎?我使用arm-linux-androideabi-g ++作爲編譯器。我想編譯的源代碼是用C++編寫的 – jav974

+0

是的,C不是C++;他們是不同的語言! – Olaf

回答

0

st_ctim是stat的較新成員,它包含nanosec精度時間(struct timespec)。不幸的是,android沒有。這裏是(Linux計算機)LSTAT的手冊的摘錄:

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 
}; 

老版本的內核及以上標準不支持納秒 時間戳字段。相反,有三個時間戳 fields-st_atime, st_mtime和st_ctime類型爲time_t,記錄時間戳,精度爲一秒。

自內核2.5.48開始,stat結構支持三個文件時間戳字段的納秒分辨率。如果定義了合適的特徵測試宏,則每個時間戳的 納秒 組件都可以通過st_atim.tv_nsec形式的名稱獲得。 納秒時間戳 已在POSIX.1-2008中標準化,並且從版本2.12開始,如果_POSIX_C_SOURCE爲 ,定義值爲200809L或更大,或者_XOPEN_SOURCE定義值爲700或更大,則glibc將公開納秒元件名稱。如果定義了_BSD_SOURCE或_SVID_SOURCE,則還定義了納秒組件的定義,即定義了2.19和 。如果前面提到的宏 都沒有定義,那麼納秒值將以st_atimensec形式的名稱公開。

所以你的代碼依賴於這個新功能,我認爲你必須修改它使用st_ctime而不是st_ctim。

+0

感謝您的提示!好的,我相應地更改了代碼,現在它通過了這一步。我不想這樣做,因爲它不是我的代碼,但我想我沒有其他選擇。 thx – jav974

+0

「不幸的是,android並沒有那個。」如果您使用的是現代NDK,則不是這樣。 –

1

如果您正在使用NDK的現代版,你將擁有一個現代struct stat:你需要https://android.googlesource.com/platform/bionic/+/master/libc/include/sys/stat.h

注意要使用NDK的unified headers,以獲得最新的標頭。這是r15的默認設置,但是可以選擇r14。

+0

有趣的是,我正在使用預編譯的工具鏈進行交叉編譯,它沒有提及使用統一頭文件的任何選項......並且我還使用了最新的ndk r15 ..感謝您的指點。我將相應更新爲1-使用統一頭文件和2用clang而不是gcc/g ++構建系統! – jav974

+0

「預編譯工具鏈」,如直接從工具鏈/編譯器使用編譯器並自己設置所有編譯器標誌?如果這就是你的意思,你應該嘗試使用[standalone toolchain](https://developer.android.com/ndk/guides/standalone_toolchain.html)。 –