链接两个具有相同定义的 object 文件时出现多重定义错误

Multiple definition error while linking two object files with same definition

基本上我的概率是这样的:

我有一个 header 文件 - foo.h 里面有一个结构指针 human *person = NULL。结构 human 的定义在 foo.h 中包含的另一个 header 中。我正在创建共享 object 文件 game.so 使用 foo.h 和少数其他 headers 和 cpps。

现在,我有两个不同的 cpp 文件 - a.cppb.cpp,其中包括 header foo.h。 我正在分别创建 object 文件 a.ob.o。 我正在链接 object 文件和 game.so 以创建另一个共享 object 文件 tennis.so,在这样做的同时,我得到了 "person" 的多个定义。我知道多重定义错误是因为 a.o 包含 person 的结构定义, b.o.

也是如此

我已经在 foo.h 中使用了 #pragma oncea.o 正在单独编译,b.o 正在单独编译。所以我不认为#pragma once 或 ifdef 在这里有用,因为 a.cppb.cpp 都包含 foo.h

由于在创建 game.so

时存在某些依赖关系,我无法将 foo.h 中的结构定义更改为任何其他 cpp 文件

有没有其他方法可以解决我在创建 tennis.so 时遇到的多重定义错误?

您似乎混淆了 DECLARATION 和 DEFINITION。您的 header 应该声明该结构,然后您的 C/C++ 将使用此类声明来定义变量或引用此类定义的实例。

您需要确保 person 变量只定义一次。为此,您只需在 foo.h:

中声明该变量
extern human *person;

然后,在foo.cpp中,你定义它:

human *person = NULL;

然后您将 foo.o 包含在构成 game.so 的目标文件中。