看起来你在编译 Redis 时遇到了一个与原子变量初始化相关的错误。这个错误通常是因为代码中使用了 ATOMIC_VAR_INIT
宏,而该宏在 C11 标准中已被弃用(deprecated),尤其是在较新的编译器版本(如 Clang 14)中可能不再支持。以下是解决步骤:
问题分析
错误信息:
error: initializer element is not a compile-time constant
static redisAtomic run_on_thread_cb g_callback = ATOMIC_VAR_INIT(NULL);
这是因为 ATOMIC_VAR_INIT
宏在新版 C 标准中已被移除,且原子变量应直接初始化(无需特殊宏)。
解决方案
修改
threads_mngr.c
文件
打开src/threads_mngr.c
,找到第 27 行:static redisAtomic run_on_thread_cb g_callback = ATOMIC_VAR_INIT(NULL);
将其改为:
static redisAtomic run_on_thread_cb g_callback = NULL;
因为原子变量可以直接用常量初始化(C11 标准允许)。
如果仍有问题,检查
redisAtomic
的定义
确保redisAtomic
是通过_Atomic
关键字定义的(Redis 通常有自己的封装)。例如:typedef _Atomic(run_on_thread_cb) redisAtomic;
如果是这样,直接赋值
NULL
是合法的。如果其他文件有类似错误
搜索整个代码库中所有使用ATOMIC_VAR_INIT
的地方,并类似地修改:grep -r "ATOMIC_VAR_INIT" src/
临时禁用警告(可选)
如果只是警告(warning)而不是错误,可以在编译时添加-Wno-pedantic
忽略:make CFLAGS="-Wno-pedantic"
但建议优先修复代码而非忽略警告。
验证修复
重新编译:
make clean && make
备注
- 此问题常见于较新版本的 Clang/GCC 编译器,因为旧代码(如 Redis 的某些分支)可能未更新到最新 C 标准。
- 如果 Redis 版本较老,建议升级到最新稳定版(如 Redis 7.2+),其中此类问题通常已修复。
如果仍有问题,请提供你的 Redis 版本和编译器版本(clang --version
),我会进一步协助!
内容由零声教学AI助手提供,问题来源于学员提问