如何安装单个Perl Crypt::OpenSSL::AES供不同的linux环境使用

如何安装单个Perl Crypt::OpenSSL::AES供不同的linux环境使用,linux,perl,openssl,cpan,Linux,Perl,Openssl,Cpan,我有一个棘手的问题,我不太确定如何解决。情况如下: 我们有一个通用的32位perl 5.10.0 32位和64位linux机器都使用它 现在的问题是,我需要为Perl安装Crypt::OpenSSL::AES模块,但是由于它构建了一个共享库,因此出现了很多问题: 如果在64位机器上构建,则模块不可用于生成的AES的“错误ELF类:ELF类64”错误 如果构建在32位机器上,则模块在64位机器上不可用,且符号未定义:AES_encrypt 我猜测的问题是,不同的机器安装了不同版本的Open

我有一个棘手的问题,我不太确定如何解决。情况如下:

  • 我们有一个通用的32位perl 5.10.0
  • 32位和64位linux机器都使用它
现在的问题是,我需要为Perl安装Crypt::OpenSSL::AES模块,但是由于它构建了一个共享库,因此出现了很多问题:

  • 如果在64位机器上构建,则模块不可用于生成的AES的“错误ELF类:ELF类64”错误
  • 如果构建在32位机器上,则模块在64位机器上不可用,且符号未定义:AES_encrypt
我猜测的问题是,不同的机器安装了不同版本的OpenSSL,它们彼此不兼容

我的问题是,我无法更改任何机器配置,我应该如何使AES模块在所有机器上工作


谢谢

Perl的默认配置非常有意地将特定于平台的内容放在一个单独的目录中;你似乎破坏了那个模型。考虑恢复它。

< P>我假设你在32位机器上建立了Perl,所以在构建过程中,配置不包括任何“制作这32位”编译器开关。如果您现在在64位机器上构建,构建过程将使用完全相同的开关,因此您将获得无法从32位perl加载的64位二进制文件-即使在64位机器上也无法加载,因为您在那里运行的32位perl二进制文件也无法加载64位共享库

您可以尝试在64位机器上构建共享perl,明确表示您想要32位perl。应该有一些用于此的配置参数。这样,您就有了一个在构建模块时设置“使用32位”编译器标志的perl。然后,您可以在每台机器上使用该版本的perl来构建模块。模块不会完全相同,但每个模块都将按其位大小运行,并且您的软件分发过程可以在分发到特定计算机时拉取正确的模块

然而,真正的问题有些落后。我假设贵公司有人在某个时候说过:“我们不想依赖发行版提供的内容,让我们构建自己的perl,我们可以在任何地方复制。”。这听起来是个好主意,但事实并非如此。不同的Linux版本使用不同版本的共享库、配置文件的默认目录、默认路径变量等。配置过程会处理这些问题,并为您的机器创建一个perl二进制文件。如果将其复制到其他计算机,则可能无法在其他版本的共享库中找到符号。它可能会尝试从不存在的目录中读取lib。它可能不包括在构建它的机器上纠正的某些错误的解决方法,但需要在复制到的旧系统上的解决方法。或者,它可能会为新系统上长期固定的问题提供一个解决方案,从而浪费CPU时间


因此,从本质上讲,只有在构建一个包含所有内容且不需要任何共享库的静态perl时,创建一个perl以随处复制才能很好地工作。您在一台机器上编译的使用perl的标准共享库不符合您可能遇到的“在我复制它的任何地方都表现相同”的请求,因为它太依赖于“周围”的东西它。

我结合使用和构建静态链接的Crypt::OpenSSL::AES解决了这个问题,这样我就有了一个完全静态链接的perl可执行文件


鉴于我无法修改环境,这是我能想到的最好办法。

你能详细说明一下吗?你是说正确的方法是安装多个perl?对于不同的体系结构,是的。也许你能找到解决这个问题的办法,但今后还会有另一个办法。