编译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
不过一开始不工作,如何解决呢?
'typedef off64_t off_t;'与''冲突,我必须在源代码中将所有'off_t'替换为'off64_t',至少现在编译。 –
aj3423
这可能会导致使用'off_t'的错误,因为它将成为'off64_t',被截断为32位的内核。而且,这个答案已经过时了,因为自r14以后'_FILE_OFFSET_BITS'已经在NDK中可用(尽管在r15c之前并不真正有效)。 –
同意我的回答已过时。此外,只有当用户错过向别名列表中添加函数时,才会导致问题,并且我提到所有库公共接口都变为'off64_t'驱动的。我错过了什么吗?不要把你的观点截断为32位。如果我们将'off64_t'传递给系统调用,并希望在32位系统上使用32位'off_t',那么我们可能会中断完整的arg列表,因为额外的32位将替换另一个参数应该使用的寄存器/堆栈槽,从而有效地移动所有后续位置参数。所以IMO最好说我们有UB而不是截断。 – Sergio