之前在编译多文件的时候发现编译器一直报undefined reference to 'XXX'的错误,后来发现是inline的问题。

1
2
3
4
5
// 原先.h内的部分代码
class Tools {
public:
int fun();
}
1
2
3
4
// 原先.cpp内的部分代码
inline int fun() {
...
}

inline去掉后才能正常编译。

具体原因参考关于 inline 函数的分析:undefined reference to

  • 如果将函数的实现放在头文件中,那么每一个包含该头文件的cpp文件都将得到一份关于该函数的定义,链接器会报函数重定义错误。
  • 如果将函数的实现放在头文件中,且标记为inline,那么每个包含该头文件的cpp文件都将得到一份关于该函数的定义,链接器不会报错。
  • 如果将函数实现放在cpp文件中,并且没有标记为inline,那么该函数可以被链接到其他编译单元中。
  • 如果将函数实现放在cpp文件中,并且标记inline,那么该函数对其他编译单元不可见,也就是其他cpp文件不能链接该函数库。