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

Prz*_*rz9 0 c c++ linker shared object

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

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

现在,我有两个不同的cpp文件- a.cppb.cpp它包括头foo.h. 我创建一个目标文件a.o分开和b.o独立。我同时链接了目标文件和game.so用于创建另一个共享目标文件的链接tennis.so,同时这样做了,“人”得到了多个定义。我知道多重定义错误是因为a.o包含的结构定义person,所以也是如此b.o

我用#pragma oncefoo.h了。a.o正在分别编译和b.o分别编译。所以我不认为的#pragma一次或IFDEF将在这里很有用,因为这两个a.cppb.cpp包括foo.h

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

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

Nik*_* C. 5

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

extern human *person;
Run Code Online (Sandbox Code Playgroud)

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

human *person = NULL;
Run Code Online (Sandbox Code Playgroud)

然后foo.o,您将组成的对象文件包括在内game.so