【问题标题】:Multiple definition error while linking two object files with same definition链接具有相同定义的两个目标文件时出现多重定义错误
【发布时间】:2017-07-27 04:07:37
【问题描述】:

基本上我的问题是这样的:

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

现在,我有两个不同的 cpp 文件 - a.cppb.cpp,其中包括头文件 foo.h。 我正在分别创建一个对象文件a.ob.o。 我正在链接对象文件和game.so 以创建另一个共享对象文件tennis.so,在这样做的同时,我得到了“人”的多个定义。我知道多重定义错误是因为 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 时遇到的多重定义错误?

【问题讨论】:

  • 结构体不存在多定义链接错误。请发布准确的代码和构建命令以重现这种情况,以及准确的编译器输出。
  • 我无法发布确切的代码,因为它很少保密。还有什么我可以做的吗?
  • 您可以创建一个 MCVE (minimal reproducible example)。这将重现问题,但不包含任何机密信息。听起来您的标头没有声明变量;它定义了变量。因此,每个包含标题的文件都包含一个定义,从而防止它们链接在一起。简单的经验法则:在标头中声明的变量应使用关键字extern 声明。
  • @M.M 我稍微修改了这个问题。现在请看一下,看看你能不能帮到我。
  • @JonathanLeffler 它是一个结构指针 Joanathan 。

标签: c++ c object linker shared


【解决方案1】:

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

extern human *person;

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

human *person = NULL;

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

【讨论】:

  • 让我试试 Nikos。
  • 这已经解决了 Nikos。非常感谢您的帮助:)
【解决方案2】:

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

【讨论】:

  • 没有罗恩。对定义和声明很清楚。结构定义可以在标题中,并且不应该像 M.M. 指出的那样创建多个定义错误。我很好地同意你的观点,即定义不应该在标题中,这就是为什么我提到由于某些依赖关系,我无法从标题中删除定义。
  • 您修改后的问题表明您实际上重复了 VARIABLE 定义(人类)。人类变量应该只定义一次。对其的引用应使用 extern 以避免冗余。为什么变量定义(即赋值)发生在标题中而不是应该“拥有”变量的模块中?如果/当在标头中定义变量时,通常应使用#ifdef _FROM_DEFINE_MODULE(定义)#else(外部声明)#endif对其进行保护
  • 是的,罗恩。感谢您的帮助:)
  • 是的,extern 的使用帮助了 Ron。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多