perl模块异常symbollookuperror的解决⽅式
关于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::Simpleperl怎么下载
⽽⼤部分需要联⽹下载的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
再次测试,就可以⽤了。
总觉得得放个图才好。