C++多个定义,尽管在多个文件中使用ifndef
C++ multiple definition despite ifndef when used in multiple files
我只是想澄清一下 - 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文件中定义它们。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时,它显示 [错误] 未终止 #ifndef
- 使用 #pragma 一次,#ifndef 在同一文件中包含保护
- C++多个定义,尽管在多个文件中使用ifndef
- 如果目标文件已经具有标头保护,我们是否应该用 #ifndef 来保护 #include
- 尽管 #ifndef,但包含两次头文件
- 在链接两个对象文件时,使用#ifndef防止定义一个函数两次
- 在一个h文件中的两个ifndef结构导致错误c2955使用类模板需要模板参数列表