【问题标题】:Already defined functions in Obj fileObj 文件中已定义的函数
【发布时间】:2015-06-04 21:00:02
【问题描述】:

我正在编写的程序中遇到一个奇怪的问题。错误如下:

错误 9 错误 LNK2005:“struct statistics __cdecl findStatistics(class std::vector,class std::allocator > >)”(?findStatistics@@YA?AUstatistics@@V?$vector@V?$Point_@H @cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@@Z) 已在 imageProcessing.obj C:\Users\BPeixoto\Documents\Visual Studio 2012\150603_testeDirection_v4 中定义\testeDirection\main.obj

我正在使用对象跟踪,并且函数“findStatistics”用于计算应该是机器人质心的点的标准偏差和平均值。之后,函数 findOutliers 计算在标准差和平均值创建的区域之外有多少点。

如有必要,我可以发布代码的必要部分。

【问题讨论】:

标签: c++


【解决方案1】:

问题

函数findStatistics() 定义了两次:在mainimageProcessing 模块中。

原因

您执行了以下一项或多项操作:

  • 将函数体复制粘贴到多个源文件中
  • #included 函数体在多个模块中的头文件,函数不是inline
  • 链接到具有与您的一个函数或另一个库中的函数同名的函数的库

可能的解决方案

  • 通过将函数的声明移动到头文件并将定义移动到源文件来删除重复
  • 在头文件中将函数声明为inline(这仅在您的函数“小”时才是一个好主意。参见:When should I write the keyword 'inline' for a function/method?
  • 将您的函数移至namespace 以避免名称冲突

【讨论】:

  • 感谢您的快速答复。
  • 您链接到一个非常解释何时使用 inline 关键字的答案。如果功能很小,您建议仅使用它是虚假的,并且链接答案中的任何内容都没有远程暗示这一点。在 C++ 中,inline 专门用作链接器提示。
  • @IInspectable 引用:“我什么时候应该为 C++ 中的函数/方法编写关键字'内联'?仅当您希望函数在标头中定义时。更确切地说,仅当函数的定义可以出现在多个编译单元中。在头文件中定义 small(如在一个衬里)函数是一个好主意,因为它为编译器提供了更多信息以在优化代码时使用。它还增加编译时间。”结束报价。是否足够暗示?
  • 好吧,对不起,那是假的。这是一个自以为是的建议,何时将函数放在标题中(我假设与 .inl 文件相比)。这与inline 关键字完全无关。正如我之前所说:inline 是一个链接器提示,不多也不少。函数的 LOC 计数永远不会用作谓词。
  • 当变量发生同样的问题时?在特殊的全局变量中。即使我编写的函数通常有大约 80 行,该建议也很有效。情况是这样定义的:我创建了一个标头来定义所有全局和定义变量。为了解决这个链接问题,我在这个头文件中定义了一个命名空间,以适应范围变量并避免与已经声明的变量发生冲突。尽管如此,程序仍会告诉全局变量,即定义变量已在另一个 .obj 文件中定义。
猜你喜欢
  • 2013-02-18
  • 2016-11-21
  • 2014-11-02
  • 2015-07-27
  • 2021-08-16
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多