尽管在多个文件中使用 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 行收到此错误,我在项目中的以下文件收到此错误:
- foo.cpp
- bar.cpp
这是我项目的结构:
Redis函数
- 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 文件可以在这里查看:
您不能直接使用 redismodule.h。它有一些定义而不是函数声明。所以如果你直接包含它,你会遇到多重定义问题。
相反,您应该将此 .h 文件拆分为一个 .h 文件和一个 .cpp 文件。在.h文件中声明这些函数,并在.cpp文件中定义它们。
我只是想澄清一下 - 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 行收到此错误,我在项目中的以下文件收到此错误:
- foo.cpp
- bar.cpp
这是我项目的结构:
Redis函数
- 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 文件可以在这里查看:
您不能直接使用 redismodule.h。它有一些定义而不是函数声明。所以如果你直接包含它,你会遇到多重定义问题。
相反,您应该将此 .h 文件拆分为一个 .h 文件和一个 .cpp 文件。在.h文件中声明这些函数,并在.cpp文件中定义它们。