perl模块异常symbol lookup error的解决方式
关于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
再次测试,就可以用了。
总觉得得放个图才好。