Search code examples
androidcandroid-ndkfuse

'sizeof(off_t) != 8' when compiling libfuse for android


I'm trying to compile libfuse with NDK, my environment:

Win10(64bit) + NDK(r14b,64bit) + libfuse(3.1.0)

Error occurs in fuse_common.h, it checks size of off_t:

$ ndk-build
[armeabi-v7a] Compile thumb  : fuse <= buffer.c
In file included from jni/../../libfuse/lib/buffer.c:15:
In file included from jni/../../libfuse/lib/fuse_i.h:9:
In file included from jni/../../libfuse/include\fuse.h:19:
jni/../../libfuse/include/fuse_common.h:745:13: error: bit-field
      '_fuse_off_t_must_be_64bit' has negative width (-1)
        { unsigned _fuse_off_t_must_be_64bit:((sizeof(off_t) == 8) ? 1 : -1); };
                   ^
1 error generated.
make: *** [obj/local/armeabi-v7a/objs/fuse/__/__/libfuse/lib/buffer.o] Error 1

here's the check in fuse_common.h:

struct _fuse_off_t_must_be_64bit_dummy_struct \
    { unsigned _fuse_off_t_must_be_64bit:((sizeof(off_t) == 8) ? 1 : -1); };

I searched on google, there's _FILE_OFFSET_BITS=64 definition, which can be used to change the size of off_t, I have this defined my 'Android.mk' file:

LOCAL_CFLAGS := \
    ....
    -D_FILE_OFFSET_BITS=64 \
    ....

And even add this line at the beginning of fuse_common.h

#define _FILE_OFFSET_BITS 64

Still not working, how to fix it?


Solution

  • NOTE Provided solution is much like workaround, see @Dan's answer for reliable and official way to get 64-bit off_t.

    On Android off_t is always 32-bit length, and there is no preprocessor macro that controls its size. (Though it is true only for NDK development since modern bionic allow to configure off_t size at compile time). And because of this you cannot compile your library directly.

    But I guess there is some way to workaround it. Android NDK offers non-POSIX extended type - off64_t, and also it provides a complementary set of library functions that accept it instead of off_t. They are distinguished by 64 suffix, i.e. lseek64(), mmap64(). So to make things work you may try to add global configuration header to your project:

    /* let off_t to be a 64-bit length */
    typedef off64_t off_t;
    
    /* use appropriate versions of system functions */
    /* list here only functions that have off_t parameters and are used by your library */
    #define mmap mmap64
    #define lseek lseek64
    

    And of course keep in mind that compiled code now is linked against *64() functions instead of regular ones and any public interfaces expect off64_t instead of off_t.