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

时间:2019-04-25 08:38:28

标签: c++ c redis linker-errors

我只是想澄清-redismodule.h不是我写的,而是来自Redis的GitHub存储库

在某些背景下,我正在编写C ++ Redis模块,并且尝试在多个文件中使用它时,redismodule.h上总是出现链接错误。我可以确认其ifndef标头中有一个redismodule.h。我主要只是将其标头用于定义,并且唯一的实现是针对RedisModule_OnLoad中的foo.cpp方法。

这是我得到的错误:

  

/ usr / bin / ld:RedisFunc / bar.cpp.o:/redismodule.h:183:多个   'RedisModule_Alloc'的定义;   RedisFunc / foo.cpp.o:/redismodule.h:183:首先在这里定义

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

  • foo.cpp
  • bar.cpp

这是我的项目的结构:

RedisFunc

  • foo.cpp
  • bar.cpp

Redis源

  • redismodule.h

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

1 个答案:

答案 0 :(得分:1)

您不能直接使用redismodule.h。它具有一些定义,而不是功能的声明。因此,如果直接包含它,将会遇到多个定义问题。

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