如何将perl库与我的跨平台脚​​本捆绑在一起?

时间:2014-06-17 14:29:36

标签: perl dependencies debian cross-platform solaris

我在Perl中开发了一个脚本,它使用了2个额外的库Net::SSH::PerlSpreadsheet::WriteExcel,我在Debian笔记本电脑上使用CPAN轻松安装了这些库。

Ultimatly,我的目标是在solaris服务器上部署此脚本。但是,此服务器未连接到Internet,因此无法自动安装缺少的依赖项。

到目前为止,我尝试使用PP,这允许我在另一台Ubuntu计算机上运行此脚本,而无需手动安装额外的库,但在Solaris上返回错误:Cannot find /lib64/ld-linux-x86-64.so.2

我怀疑这是由于两种体系结构之间存在差异,我在脚本中打包了一个包含所有依赖项的./lib文件夹(./lib是通过pp -B -p -o script.par myscript.pl获取并提取生成./lib文件夹)。

根据我在this question中找到的潜在客户,我在脚本开头尝试使用use lib "./libBEGIN { unshift @INC, "lib"; },但我收到错误消息说我没有包含我运行它时的库。

有没有办法移植这些库?还有另一种方法吗?

1 个答案:

答案 0 :(得分:2)

Net::SSH::Perl依赖于多个XS模块,例如Math::GMPMath::Pari等。在Solaris盒子上没有办法实际编译它们(如用C编译它们,而不是Perl)。

您还需要底层的C库(即libgmp,libpari)。 Math::Pari构建脚本将下载其库,但您已指出在目标Solaris框中无法实现。

cpanm可以帮助您下​​载Perl依赖项,以便将它们移动到目标计算机并在其上构建它们。

如果您的项目Makefile.PLcpanfile中有正确的相关条目,则

cpanm --installdeps  -L deps --save-dists dists .
项目目录中的devel机器上的

(注意尾随点)会将所有依赖项下载到dists目录中。

然后,您可以将该目录复制到目标Solaris框(以及cpanm),并使用其cpanm选项将其传递给--mirror

例如,我只针对Net::SSH::Perl的依赖项执行此操作:

cpanm --installdeps -L deps --save-dists dists Net::SSH::Perl

它已将34个发行版下载并安装到deps,并将归档保存在dists中。

我可以通过以下方式使用下载的发行版构建Net::SSH::Perl

cpanm --mirror file://${PWD}/dists  Net::SSH::Perl

请注意,虽然cpanm很方便,但实际上并不需要它来安装所需的模块。您可以通过解压缩然后运行

来手动安装它们(按正确的顺序)
perl Makefile.PL
make
make install

perl Build.PL
./Build
./Build install

适用于特定模块