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

时间:2017-07-27 04:07:37

标签: c++ c object linker shared

基本上我的疑问是:

我有一个头文件 - foo.h,其中包含结构指针human *person = NULL。结构human的定义位于foo.h中包含的另一个标头中。我正在使用game.so和其他一些标头和cpp创建共享对象文件foo.h

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

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

由于创建foo.时的某些依赖关系,我无法将game.so h中的结构定义更改为任何其他cpp文件

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

2 个答案:

答案 0 :(得分:4)

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

中声明该变量
extern human *person;

然后,在foo.cpp中,您可以定义它:

human *person = NULL;

然后,您将foo.o包含在组成game.so的对象文件中。

答案 1 :(得分:1)

您似乎将宣言与定义混为一谈。您的标题应该DECLARE结构,然后您的C / C ++将使用此类声明来定义变量或引用此类定义的实例[s]。