ftello() и fseeko() ошибки сборки Android

Я пытаюсь собрать Android L для 64-битной архитектуры.

Мой код выглядит так:

#if (HAS_LARGE_FILE_SUPPORT)
#define _FILE_OFFSET_BITS 64   //Defined in header file


/*Some File operations*/
#if HAS_LARGE_FILE_SUPPORT
     return fseeko(iFile, offset, seekmode);
#else
     return fseek(iFile, offset, seekmode);


/*Some File operations*/
    #if HAS_LARGE_FILE_SUPPORT
         return ftello(iFile, offset, seekmode);
    #else
         return ftell(iFile, offset, seekmode);

Я получаю ошибки ниже ftello и fseeko:

error: call to 'ftello' declared with attribute error: not available with _FILE_OFFSET_BITS=64

error: call to 'fseeko' declared with attribute error: not available with _FILE_OFFSET_BITS=64

Я проверил fseeko и ftello, на страницах руководства упоминается, что определение _FILE_OFFSET_BITS со значением 64 превратит off_t в 64-битный тип. Тем не менее я вижу эту ошибку. Я проверил эту ошибку, но не нашел удовлетворительного ответа.

Будет очень полезно, если кто-нибудь может помочь мне с этим.


person Android_Noob    schedule 28.09.2015    source источник
comment
Вы определяете -D_LARGEFILE_SOURCE (см. stackoverflow.com/q/14184031/694576)?   -  person alk    schedule 28.09.2015
comment
@alk Спасибо за ответ, я также пытался определить указанный выше флаг, но все равно получаю ту же ошибку. #define _LARGEFILE_SOURCE 1 #define _LARGEFILE64_SOURCE 1   -  person Android_Noob    schedule 29.09.2015
comment
Возможно, проблема в прототипах функций. этот возвращаемый тип «возврата», вероятно, неверен.   -  person user3629249    schedule 30.09.2015
comment
это правильный синтаксис для ftello() : int fseeko(FILE *stream, off_t offset, int whence); который не соответствует опубликованным вами прототипам.   -  person user3629249    schedule 30.09.2015
comment
@user3629249: ... правильный синтаксис для ftello() : int fseeko(... Эээ, что пожалуйста?   -  person alk    schedule 03.10.2015
comment
Отлично работает для меня. Вы определяете макросы в своем источнике? Я считаю, что это локализовано. Вы должны определить их в своем Application.mk. APP_CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64   -  person Leandros    schedule 06.10.2015
comment
Следует также отметить, что ftell принимает только один аргумент, FILE*. И fseek изменяется только, это смещение принимает off_t, а ftell возвращает off_t, а не просто long.   -  person Leandros    schedule 06.10.2015
comment
@alk Однако он прав. Подписи следующие: int fseeko(FILE *stream, off_t offset, int whence) и off_t ftello(FILE *stream). Взято со справочных страниц Linux здесь.   -  person Leandros    schedule 06.10.2015
comment
Я не могу воспроизвести вашу ошибку, не могли бы вы показать нам свои Application.mk и Android.mk, пожалуйста?   -  person Leandros    schedule 06.10.2015
comment
@ user3629249: Я имел в виду ваш комментарий, касающийся: ftello и fseeko, даже цитируя его.   -  person alk    schedule 07.10.2015
comment
@Leandros: Мой комментарий был не о правильном или неправильном, а о том, что на самом деле пытается выразить user3629249. Просто перечитайте комментарий: stackoverflow.com/questions/32826175/   -  person alk    schedule 07.10.2015
comment
@alk О. хаха. Пропустил это.   -  person Leandros    schedule 07.10.2015


Ответы (2)


Я решил аналогичную проблему, указав API на 24 при создании автономного ndk.

./make_standalone_toolchain.py --arch arm --api 24 --stl libc++ --install-dir /tmp/ndk

Из файла ndk sysroot/usr/include/stdio.h похоже, что ftello поддерживается только API больше или равно 24

#if __ANDROID_API__ >= 24
int fgetpos(FILE* __fp, fpos_t* __pos) __RENAME(fgetpos64) __INTRODUCED_IN(24);
int fsetpos(FILE* __fp, const fpos_t* __pos) __RENAME(fsetpos64) __INTRODUCED_IN(24);
int fseeko(FILE* __fp, off_t __offset, int __whence) __RENAME(fseeko64) __INTRODUCED_IN(24);
off_t ftello(FILE* __fp) __RENAME(ftello64) __INTRODUCED_IN(24);
#endif /* __ANDROID_API__ >= 24 */
person alijandro    schedule 08.07.2019

первый #if применяется ко всему опубликованному коду, а не только к следующей строке.

аналогичные условия существуют для других условий компиляции #if и #else,

т.е. каждый #if ... должен заканчиваться #endif

person user3629249    schedule 07.10.2015