mac上编译redis ,报错fstat64
shell
void
replication.c:1289:31: error: variable has incomplete type 'struct stat64'
struct redis_stat buf;
^
replication.c:1289:20: note: forward declaration of 'struct stat64'
struct redis_stat buf;
^
./config.h:45:20: note: expanded from macro 'redis_stat'
#define redis_stat stat64
^
replication.c:1336:21: error: call to undeclared function 'fstat64'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
因为 macOS 的 fstat
函数已经默认支持大文件(即自动处理大于 2GB 的文件),因此不需要使用 fstat64
。
查看 src/config.h
文件
可以看到关于fstat64
的引用
#if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6)
#define redis_fstat fstat64
#define redis_stat stat64
#else
#define redis_fstat fstat
#define redis_stat stat
#endif
这里是走了if
分支,只要修改代码,让走else
分支就可以了。
if
中主要定义了两个条件,__APPLE__
在mac
上肯定是存在的,另一个条件MAC_OS_X_VERSION_10_6
不存在,就走了if
分支。因此我们定义MAC_OS_X_VERSION_10_6
就可以走到else
分支了。
解决方法就是在这段代码的上面增加MAC_OS_X_VERSION_10_6
的定义
c
#define MAC_OS_X_VERSION_10_6
#if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6)
#define redis_fstat fstat64
#define redis_stat stat64
#else
#define redis_fstat fstat
#define redis_stat stat
#endif