链接两个具有相同定义的 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.cpp
和 b.cpp
,其中包括 header foo.h。
我正在分别创建 object 文件 a.o
和 b.o
。
我正在链接 object 文件和 game.so
以创建另一个共享 object 文件 tennis.so
,在这样做的同时,我得到了 "person" 的多个定义。我知道多重定义错误是因为 a.o
包含 person
的结构定义, b.o
.
也是如此
我已经在 foo.h
中使用了 #pragma once
。 a.o
正在单独编译,b.o
正在单独编译。所以我不认为#pragma once 或 ifdef 在这里有用,因为 a.cpp
和 b.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
的目标文件中。
基本上我的概率是这样的:
我有一个 header 文件 - foo.h
里面有一个结构指针 human *person = NULL
。结构 human
的定义在 foo.h 中包含的另一个 header 中。我正在创建共享 object 文件 game.so
使用 foo.h
和少数其他 headers 和 cpps。
现在,我有两个不同的 cpp 文件 - a.cpp
和 b.cpp
,其中包括 header foo.h。
我正在分别创建 object 文件 a.o
和 b.o
。
我正在链接 object 文件和 game.so
以创建另一个共享 object 文件 tennis.so
,在这样做的同时,我得到了 "person" 的多个定义。我知道多重定义错误是因为 a.o
包含 person
的结构定义, b.o
.
我已经在 foo.h
中使用了 #pragma once
。 a.o
正在单独编译,b.o
正在单独编译。所以我不认为#pragma once 或 ifdef 在这里有用,因为 a.cpp
和 b.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
的目标文件中。