AIX 7.1编译Redis 6.2.5提示无reqevents成员问题咨询
问题根因
该问题是AIX 7.1系统头文件的宏定义冲突导致的,并非结构体成员被自动拼接前缀:
AIX 7.1自带的<poll.h>头文件为了兼容旧版本的接口规范,存在全局宏定义 #define events reqevents。在预编译阶段,这个宏会将代码中所有匹配的events标识符无条件替换为reqevents,你代码里写的eventLoop->events实际提交给编译器的内容已经被替换为eventLoop->reqevents,而aeEventLoop结构体本身没有定义该成员,因此触发编译报错。
Linux、macOS平台的<poll.h>不存在这个兼容宏,因此不会出现冲突。
解决办法
按优先级从高到低推荐以下方案:
方案1:单文件取消冲突宏
编辑Redis源码的src/ae.c文件,在#include <poll.h>行之后添加一行代码:#undef events该方案仅在
ae.c编译单元内取消events宏的定义,不会影响系统poll接口的正常调用,改动最小无副作用。方案2:编译参数全局取消宏
无需修改源码,执行编译命令时添加取消宏定义的编译参数即可:make CFLAGS="-Uevents"方案3:重命名冲突成员
如果前两个方案不适用,可以将aeEventLoop结构体中的events成员重命名为不会和系统宏冲突的名称(比如file_events),再同步替换所有引用该成员的代码即可,该方案改动量较大,仅作为备选。
内容的提问来源于stack exchange,提问作者the_storyteller
相关产品推荐
相关产品推荐

