If C++ is enabled with Bionic on API Level < 24 ( and with NDK >= r15 as lower versions just ignore the issue ) you get errors of ::fgetpos and ::fsetpos error: 'fsetpos' has not been declared in '::' .
The issue is that API Level < 24 doesn't implement large files (64 bit), so when _FILE_OFFSET_BITS is 64 and API Level < 24, the functions fgetpos, fsetpos, fseeko, and ftello are not defined. The behavior described above can be observed by going to 'android-ndk-rxxx/sysroot/usr/include/stdio.h' and watching the condition when those symbols are defined ( note: the control define __USE_FILE_OFFSET64 is defined if _FILE_OFFSET_BITS if 64) It's a known issue and bionic's docs ask you to stop defining _FILE_OFFSET_BITS to 64 to solve it: https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md Clang builds seem to get around this using libandroid_support on those cases ( android/ndk#480 ), which is not available when building the gnu std c++. libstdc++-v3/ChangeLog * config/os/bionic/os_defines.h: Undefines _FILE_OFFSET_BITS when it's 64-bit and Api Level < 24 --- libstdc++-v3/config/os/bionic/os_defines.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/config/os/bionic/os_defines.h b/libstdc++-v3/config/os/bionic/os_defines.h index c534838aea3..27605fa8baa 100644 --- a/libstdc++-v3/config/os/bionic/os_defines.h +++ b/libstdc++-v3/config/os/bionic/os_defines.h @@ -33,4 +33,16 @@ // System-specific #define, typedefs, corrections, etc, go here. This // file will come before all others. +// If _FILE_OFFSET_BITS is 64 and __ANDROID_API__ < 24, there will be +// errors of undefined fgetpos, fsetpos, fseeko, and ftello because their +//64-bit versions are only available from API Level 24 onwards. +// +// See https://github.com/android/ndk/issues/480 +// +// See also +// https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md +#if (_FILE_OFFSET_BITS == 64) && (__ANDROID_API__ < 24) +#undef _FILE_OFFSET_BITS +#endif + #endif