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

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

本文关键字:ifndef 文件 定义 C++      更新时间:2023-10-16

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

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

这是我得到的错误:

/

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

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

  • 呜.cpp
  • 酒吧.cpp

这是我的项目结构:

瑞迪斯芬克

  • 呜.cpp
  • 酒吧.cpp

雷迪斯源

  • Redismodule.h

FOO.cpp包括:

福.H

foo.h 包括:

Redismodule.h

酒吧.cpp包括:

酒吧.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文件中定义它们。