我可以重新使用使用不同版本的 Perl 编译但具有相同版本号的模块吗?

Can I re-use modules compiled with a different build of Perl, but with the same version number?

Cross-post 来自 Perl Monks: http://www.perlmonks.org/?node_id=1115125

我的部门需要手动编译Perl模块,然后上传到网络共享文件系统供开发人员共享和使用。我们当前的模块集是使用我的系统 Perl 构建的,/usr/bin/perl -V 列为 revision 5 version 10 subversion 1

但是,我们有兴趣构建一个单独的 Perl 副本,我们也可以将其上传到网络文件系统。这样我们就不必使用我们每台机器的系统 Perl,它可以因机器而异。一种可以在每台机器上成为标准的 "central" Perl。

因此,我需要在我的主目录中构建 Perl 的本地副本。我确保安装与我的系统 Perl 相同的版本,perl-5.10.1。我使用以下 Configure 后跟一个简单的 makemake testmake install:

来完成此操作
./Configure -des -Dprefix=/home/myuser/localperl -Duserelocatableinc

-Dprefix 将它安装到我的主目录中的文件夹 localperl 中,而 -Duserelocatableinc 标志使它成为这样,如果文件夹被移动(即,上传到网络文件系统)。

当我尝试使用我的一个脚本对其进行测试时,问题就出现了,该脚本需要我们手动构建的 Perl 模块库中的一个模块。我不断收到以下错误:

/home/myuser/localperl/bin/perl: symbol lookup error: .../auto/DBI/DBI.so: undefined symbol: Perl_Istack_sp_ptr

显然我的脚本使用了共享 DBI 模块,但 运行 出错了。通过在 Internet 上进行研究,人们说我需要使用新构建的 Perl 重新编译模块。

然而,这两个 Perl 是相同的版本,并且是在同一台机器上构建的。有人可以帮助我更好地了解是什么阻止了这些模块与我本地构建的 Perl 一起工作吗?我尝试使用尽可能接近机器 Perl 的 Configure 设置重建本地 Perl,以尝试查看是否可行:

-Dversion=5.10.1 
-Dmyhostname=localhost 
-Dcc=gcc 
-Dinc_version_list=5.10.0 
-Darchname=x86_64-linux-thread-multi 
-Dusethreads 
-Duseithreads 
-Duselargefiles

到目前为止,这还没有阻止错误。有没有办法让我本地构建的 Perl 与机器 Perl 编译的模块一起工作,或者我必须重新编译它们并重新分发一组新的模块?

事实证明,,您可以重复使用使用具有相同版本号的不同 Perl 版本编译的模块。如上所述,诀窍是使用 ./Configure 标志构建您的 localperl 并尽可能接近您的系统 Perl。您可以通过 运行 perl -V 确定系统 Perl 使用的 ./Configure 标志。然后,您应该将这些设置与上面列出的标志一起使用。我的直觉是 -Dcc=-Darchname= 是要匹配的关键值,尽管我还没有时间检验这个假设。

那么,如果我已经完成了所有这些,但仍然无法正常工作,我的问题是什么?简单 - 测试脚本!在我的 shebang 行中,我仍然指向我当天早些时候编译的错误 Perl 版本!哦!一旦我将脚本指向带有所有额外 ./Configure 选项的新构建,它就可以正常工作并且能够使用所有使用系统 Perl 构建的模块。