今天遇到一个问题,在利用xxx.so库链接成可执行文件的时候,xxx.so有好几个函数符号一直报"undefined reference "的错误,仔细检测了很多遍,那几个函数确实是申明且定义了的。折腾一下午,后面发现这些函数被定义了成了inline函数,其实看到inline函数的时候也并没有想到是这个错误,只是试探性的把它去掉之后,卧槽,这个错误竟然消失了。
发现错误之后仔细想了一下,inline函数在调用的地方是直接展开的,这个过程在程序编译的时候就完成了,所以在链接的时候在符号表里就不存在inline函数的符号索引了,当然就会报这个错误了。
所以解决这个问题主要就是需要在预编译阶段把调用的地方的inline函数全部展开,所以inline函数得写在头文件里而不是源文件里。
举例,有一个类HELLO中实现了一个inline函数print(),然后在main.cpp文件中试图使用HELLO中的inline函数,那么在编译生成main可执行文件的时候则会报"main.cpp:(.text+0xe9): undefined reference to `HELLO::print()'"错误:
#ifndef HELLO_H_
#define HELLO_H_
#include<string>
#include<iostream>
class HELLO
{
public:
HELLO();
explicit HELLO(std::string str);
void print();
private:
std::string _str;
};
#endif
#include "hello.hpp"
HELLO::HELLO()
{
_str = "WORLD";
}
HELLO::HELLO(std::string str)
{
_str = str;
}
inline void HELLO::print()
{
std::cout << _str << std::endl;
}
#include "hello.hpp"
int main()
{
HELLO hello("hello");
HELLO world("world");
hello.print();
world.print();
return 0;
}
把上面的inline函数print写在头文件中这不会有任何问题。