尽管在多个文件中使用 ifndef,C++ 多重定义

C++ multiple definition despite ifndef when used in multiple files

我只是想澄清一下 - redismodule.h 不是我写的,而是来自 Redis[=18 的 GitHub 仓库=]

对于某些背景,我正在编写一个 C++ Redis 模块,当我尝试在多个文件中使用它时,我在 redismodule.h 上不断收到链接错误。我可以确认他们的redismodule.h header中有一个ifndef。我主要只是使用他们的 header 来定义,唯一的实现是 foo.cpp.

中的 RedisModule_OnLoad 方法

这是我遇到的错误:

/usr/bin/ld: RedisFunc/bar.cpp.o:/redismodule.h:183: multiple definition of 'RedisModule_Alloc'; RedisFunc/foo.cpp.o:/redismodule.h:183: first defined here

我在第 183 到 306 行收到此错误,我在项目中的以下文件收到此错误:

这是我项目的结构:

Redis函数

Redis 来源

foo.cpp包括:

foo.h

foo.h包括:

redismodule.h

bar.cpp包括:

bar.h

bar.h包括:

redismodule.h

我的CMakeLists.txt文件:

include_directories(src)
add_executable(redis-server
        src/adlist.c
        ...
        src/t_stream.c
        )

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pedantic -DREDIS_STATIC= -Wall -W -Wno-missing-field-initializers")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g -ggdb -rdynamic")

include_directories(RedisFunc)

configure_file(redis.conf redis.conf COPYONLY)

add_library(RedisFunc MODULE
        RedisFunc/foo.cpp
        RedisFunc/bar.cpp
        )

redismodule.h 文件可以在这里查看:

https://github.com/antirez/redis/blob/5.0/src/redismodule.h

您不能直接使用 redismodule.h。它有一些定义而不是函数声明。所以如果你直接包含它,你会遇到多重定义问题。

相反,您应该将此 .h 文件拆分为一个 .h 文件和一个 .cpp 文件。在.h文件中声明这些函数,并在.cpp文件中定义它们。