项目在windows操作系统正常运行,但是在linux操作系统运行报错dlopen: cannot load any more object with static TLS,报错图如下:
错误提示字面意思无法通过线程局部存储加载更多的对象。
错误原因:主要出现在python import导入库的顺序问题,可能出现在import各种python库时,由于代码中写的import顺序导致报这个错。
如我的项目中是在import paddle时报的错,但是修改代码中import的顺序时问题无法解决,这个时候就应该考虑是库版本相关的问题,在引用的库中加载的其他库顺序问题导致,因此无法在代码中修改相关顺序,所以跟踪错误报错点core.py
令人惊喜的是有巨大收获,如图:
良心的paddle开发者在代码中给出了注意事项:当linux平台glibc版本<2.22,import导入paddle初始化时可能就会报dlopen: cannot load any more object with static TLS这个错误!解释了原因,同时给出了解决方案:
- 在加载core_avx.so前先预加载libgomp.so
- 最终解决奥义,更新glibc编译器版本高于2.22
同时下面代码判断当前系统为linux并且glibc版本低于2.23就执行libgomp.so的预加载。
查看项目部署linux系统的glibc版本:
系统glibc版本为2.18!远达不到要求!
可以判断系统我的项目中预加载libgomp.so失败导致初始化报错。
解决方案:升级glibc版本到2.23。
不再报错,问题解决!非常建议linux系统部署python相关项目时,将glibc版本更新到较新版本!同时面对报错,应该跟踪到库源码。
版权归原作者 blobliu 所有, 如有侵权,请联系我们删除。