今晚在一个项目上工作时,我挣扎了一段时间,抱怨一个“重复符号”的链接器错误。来自clang/llvm编译器的重复符号错误
我最终发现我有一个定义的帮助函数,而不是在我的头文件中声明,这是问题的根源(在一个小时内失去了它)。
为什么我可以像这样在我的头文件中定义内联函数;
int get_val const {return r;}
但类外部的相同定义会引发链接器错误?
今晚在一个项目上工作时,我挣扎了一段时间,抱怨一个“重复符号”的链接器错误。来自clang/llvm编译器的重复符号错误
我最终发现我有一个定义的帮助函数,而不是在我的头文件中声明,这是问题的根源(在一个小时内失去了它)。
为什么我可以像这样在我的头文件中定义内联函数;
int get_val const {return r;}
但类外部的相同定义会引发链接器错误?
类内成员函数定义被隐式标记为inline
,而非成员函数定义不是,因此,如果您的定义位于头文件中,则只要多个翻译单元包含,就会中断one-definition-rule(ODR)你的标题。 inline
提供了解决这个问题的方法。
所以,你需要明确地标记你的非成员函数为inline
:
inline int foo() {return 42;}
或者,仅在头声明,并在.cpp
文件中定义它。
如果你需要一个内联函数,你应该在头文件中定义它。你可以看到C++ Primer(第4版),它有一些关于内联函数的页面。我想你可以在那里得到你的答案。
我们不是都花了无数个小时追鬼...... – vonbrand