2017-07-17 91 views
1

编译libfuse当我试图编译libfuse与NDK,我的环境:'!的sizeof(off_t)= 8' 为Android

Win10(64位)+ NDK(R14B,64位)+ libfuse(3.1。 0)fuse_common.h发生

错误,它会检查的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 

这里是在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); }; 

我搜索谷歌,还有_FILE_OFFSET_BITS=64定义,它可以用来改变的off_t大小,我有这个定义我的“Android.mk”文件:

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

即使加上这一行在fuse_common.h

#define _FILE_OFFSET_BITS 64 

不过一开始不工作,如何解决呢?

回答

0

备注提供的解决方案与解决方法非常相似,请参阅@ Dan的可靠和官方方式获得64位的答案off_t

在Android上off_t始终是32位长度,并且没有预处理器宏来控制其大小。 (尽管现代仿生允许在编译时配置off_t的大小,但只适用于NDK开发。正因为如此,你不能直接编译你的库。

但我想有一些方法可以解决它。 Android NDK提供非POSIX扩展类型 - off64_t,并且它还提供了一组补充库函数,可以接受它而不是off_t。它们以64后缀区别,即lseek64(),mmap64()。因此,为了使事情工作,你可以尝试全局配置头添加到您的项目:

/* 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 

,当然还有记住,编译后的代码现在对*64()功能,而不是常规的人以及任何公共接口想到off64_t,而不是链接off_t

+0

'typedef off64_t off_t;'与''冲突,我必须在源代码中将所有'off_t'替换为'off64_t',至少现在编译。 – aj3423

+1

这可能会导致使用'off_t'的错误,因为它将成为'off64_t',被截断为32位的内核。而且,这个答案已经过时了,因为自r14以后'_FILE_OFFSET_BITS'已经在NDK中可用(尽管在r15c之前并不真正有效)。 –

+0

同意我的回答已过时。此外,只有当用户错过向别名列表中添加函数时,才会导致问题,并且我提到所有库公共接口都变为'off64_t'驱动的。我错过了什么吗?不要把你的观点截断为32位。如果我们将'off64_t'传递给系统调用,并希望在32位系统上使用32位'off_t',那么我们可能会中断完整的arg列表,因为额外的32位将替换另一个参数应该使用的寄存器/堆栈槽,从而有效地移动所有后续位置参数。所以IMO最好说我们有UB而不是截断。 – Sergio

3

更新到NDK r15c。 _FILE_OFFSET_BITS=64从那里工作。

请注意,大多数off64_t系统调用不可用,直到android-21。如果您的minSdkVersion设置为低于此值,并且您使用_FILE_OFFSET_BITS=64,则很多功能将不可用。