本文主要是介绍运行时报 symbol lookup error: xxx.so: undefined symbol: 原因分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
linux程序编译的时候没有问题,在运行的时候报 symbol lookup error: xxx.so: undefined symbol:
使用ldd -r xxx.so查看,可以看到跟运行时报错类似的信息:
出现这个问题的原因很多,这里只是记录我遇到的两个情况分析:
场景一:
程序A调用了so B,so B调用了 so C,so B里调用 so C的地方,是模板函数里,而我把模板函数的定义放到了.cpp文件,由于在编译阶段并不对模板函数进行实例化,从而导致 so B 并没有真正链接so C,导致运行时找不到so C的符号表。
解决方法是把 so B 中 调用 so C 的模板函数的定义放到.h文件。
血的教训:模板函数的定义尽量放在.h文件,不要放到.cpp文件中。
场景二:
定义了一个单例类,在类的定义里显示地声明了类的构造函数、析构函数,但是没有对构造函数和析构进行定义。
由于在其他cpp中调用单例的时候是通过get_instance的方式,没有构造对象的过程,因此编译的时候没有报错,但是在运行的时候报了 undefined symbol。
教训:类定义时显示地声明构造函数、析构函数的时候,一定要记得进行相应的定义!
这篇关于运行时报 symbol lookup error: xxx.so: undefined symbol: 原因分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!