来自 clang/llvm 编译器的重复符号错误

Duplicate Symbol error from clang/llvm compiler

本文关键字:符号 错误 编译器 clang llvm 来自      更新时间:2023-10-16

今晚在一个项目上工作时,我为一个链接器错误而苦苦挣扎了一段时间,该错误抱怨"重复符号"。

最终发现我定义了一个辅助函数,而不仅仅是在我的头文件中声明,这就是问题的根源(追逐这个浪费了一个多小时)。

为什么我可以像这样在我的标头中定义内联函数;

int get_val const {return r;}

但是类外的相同定义会引发链接器错误?

类内成员函数定义隐式标记为inline,而非成员函数定义则不是,因此,如果您的定义位于头文件中,则只要多个翻译单元包含您的标头,就会破坏一个定义规则 (ODR)。 inline提供了一种解决此问题的方法。

因此,您需要将非成员函数显式标记为inline

inline int foo() {return 42;}

或者,仅在标头中声明它并在.cpp文件中定义它。

请参阅这篇关于inline函数的相关文章。

如果需要内联函数,则应在头文件中定义它。你可以看到C++ Primer(4th edtion),其中有一些关于内联函数的页面。我想你可以在那里得到答案。

相关文章: