专栏名称: 生信媛
生信媛,从1人分享,到8人同行。坚持分享生信入门方法与课程,持续记录生信相关的分析pipeline, python和R在生物信息学中的利用。内容涵盖服务器使用、基因组转录组分析以及群体遗传。
目录
相关文章推荐
生物制品圈  ·  21世纪初的疫苗安全问题 ·  4 天前  
生信宝典  ·  微生物组-扩增子16S分析和可视化(2025.4) ·  6 天前  
BioArt  ·  ​Molecular ... ·  6 天前  
BioArt  ·  ​Molecular Cell | ... ·  6 天前  
51好读  ›  专栏  ›  生信媛

perl模块异常symbol lookup error的解决方式

生信媛  · 公众号  · 生物  · 2017-06-16 10:49

正文

关于perl这个让人又爱又恨的编程语言,在大学的时候就折腾了好久(三个月吧),折腾完之后发现自己连个实现多序列比对xml结果的解析都实现不了,后来就换python了。不过毕竟当前很多主流生信软件还是采用的perl,跟perl打交道总不可避免,有麻烦也不可避免。


我遇到的问题是,报错perl: symbol lookup error:**** undefined symbol: Perl_xs_apiversion_bootcheck。


事情的起因是:系统内核由ubuntu distribution 换成了CentOS,虽然都是linux,有些套路还是不太一样。centOS的更新周期比较长,但稳定性比较高,这里就是说一下为什么换系统,具体的不同,说不清楚。  系统换了之后所有的个人配置文件保留,包括所有的packages,libraries。


最近要用到一些依赖于perl环境的软件,包括miRNA领域经典的mirdeep2 和另一个常用的Transdecoder。不得不说perl的模块依赖真可谓错综复杂。

mirdeep2 依赖于PDF::API2 跟 Compress::Zlib

Transdecoder 依赖于DB_File

Transdecoder之后就要用到Trinotate,而Trinotate貌似依赖于Compress::Zlib

还有貌似个什么plugin依赖于LWP::Simple

而大部分需要联网下载的perl程序都依赖于LWP::Simple


由于新管理员采用了conda管理所有能管理的东西,但保留了所有的personal configure。


于是,我用什么都有类似报错:

perl: symbol lookup error:/lib/perl5/x86_64-linux-thread-multi/auto/DB_File/DB_File.so: undefined symbol: Perl_xs_apiversion_bootcheck

经过百度/google一通,得知原因是由于模块版本跟当前环境中的perl版本的不兼容


解决问题的步骤如下:

1. 弃用了管理员的conda下的cpan,自己下载了cpanm对所依赖的包进行了安装

    结果:由于cpanm 依赖源比cpan少,有时候只能从镜像下载,有些版本安装不了,Failed


2. 弃用了/usr/bin/perl,自己安装了bioconda环境,重装了perl5,v5.22.0

    结果:刚开始看着好像能用了,的确能用了,但由于很多软件依赖的perl脚本起头就是/usr/bin/perl,管理员给我用的测试脚本改成了/usr/bin/env perl, 测试脚本可以用了, 但别的还是不行; 相当于Failed


3. 一怒之下把自己所有的perl库都卸掉,把bioconda的PATH删掉,仍然用/usr/bin/perl,然后cpan重装

    结果: 报错,只不过是换了一种反式,类似于Abort: load XXXX failed, 这里忘了记录。


4. 冷静了一会,开始想起来曾经看过的草泥马perl书上讲过一个用来测试perl模块的命令:

    执行 perl -MComress::Zlib -e 1

    得到报错:Compress::Raw::Zlib object version 2.012 does not match bootstrap parameter 2.01

    意思就是仍然是安装版本跟环境要求不同,略慌,明明删了好几次了——肯定是没删干净

    执行find `perl -le 'print "@INC"'` | grep Zlib

    得到二十多行内容,也就是说在perl @INC里还有之前残存的Zlib,力求一次删干净

    执行find `perl -le 'print "@INC"'` | grep Zlib > remove.list | rm -rf `cat remove.list`

    之后再执行perl -MComress::Zlib -e 1, 提示: Can't locate XXXXX in @INC

    执行cpan install Comress::Zlib

    再次测试,就可以用了。


总觉得得放个图才好。