C ++链接器错误与类外的函数定义

时间:2017-03-13 16:56:39

标签: c++

我的C ++代码出现了这么奇怪的错误。

我想用一些方法维护一个头文件。让我们称之为Util.hpp。我有以下简单的方法。

bool CheckVal(int value) {

  if (value == 1)
    return true;
  else
    return false;    
}

我将Util.hpp包含在另一个班级的cpp&调用方法。我最终得到一个链接器错误

:-1: error: 3 duplicate symbols for architecture x86_64

我在osx上用clang构建它。

如何摆脱此错误? 我正在做的事情出了什么问题?

尽管内联功能,我仍然遇到错误。真奇怪!

2 个答案:

答案 0 :(得分:2)

如果您在头文件中保留自由函数定义,则必须使用inline关键字:

   inline bool CheckVal(int value) {       
// ^^^^^^
      return value == 1;
   }

否则函数定义出现在包含头文件的每个翻译单元中,并且链接器会看到它的多个定义。

同样如上所述,您不需要if / else来重新调整bool值。

另一种解决方案是在标题

中声明该函数
bool CheckVal(int value);

并将实施(定义)移至单独的翻译单元 这至少具有以下优点:如果您在实现中更改了某些内容,那么该标题上的任何dependend翻译单元都不需要重新编译。

答案 1 :(得分:1)

  

我在做什么是错的?

一个定义规则要求(非内联)函数必须恰好定义一次

如果您在多个翻译单元中包含标题,则会有多个定义,因此会违反odr。

如果函数有多个不同的定义,那也违反了odr。

  

如何摆脱这个错误?

解决方案1:不要在标题中定义函数。而是在源文件中定义它。源文件不包含在其他源文件中,因此在使用此方法时应该只有一个定义。

解决方案A:声明函数inline

在这两种情况下,请检查没有其他功能相同的名称。

仅当函数使用了odr时。这个微妙之处与这个问题无关。