我们使用Net::SSLeay 1.55
和Carton
将use lib
安装到“本地”目录中。
编译时一切正常,但在Net::LDAP
希望使用Net::SSLeay
建立安全连接的运行时,我们得到:
Can't locate object method "tid" via package "threads" at /usr/lib64/perl5/XSLoader.pm line 94.
尝试在cpanfile中定义XS :: Loader并将其安装到Carton中,但是虽然调用了本地安装的XS :: Loader,但仍然会出现上述错误。
问题几乎肯定与this Net::SSLeay bug有关(因为我们实际上是在程序中覆盖SIG{DIE}
,这会触发错误),但据报道该错误已在{{1}中修复}。
在我们的系统上,我们Net::SSLeay 1.46
(显然由系统/usr/lib64/perl5/auto/Net/SSLeay/SSLeay.so
使用)以及本地安装的Net::SSLeay 1.34
供SSLeay.so
使用。但也许正在使用系统Net::SSLeay 1.55
?
我们如何确保SSLeay.so
使用正确的Net::SSLeay
文件(如果这仍然是我们仍然看到错误的原因),或以其他方式击败此错误?
.so
答案 0 :(得分:0)
你得到了一个system-perl或一个local :: lib mixup。
有人将系统perl称为可执行文件而不是私有$^X
,导致调用错误的模块。现在有些人仍然认为只有一个perl。从有限的信息来看,这似乎不是你的情况。
或者某人正在弄乱@INC
,更喜欢错误的模块路径超过您的本地@INC
。看起来你正在调用旧系统Net :: SSLeay 1.34。
XSLoader通常会忽略自定义LD_LIBRARY_PATH
覆盖,因此不能这样。
您的问题中存在错误: 在我们的系统上,我们有/usr/lib64/perl5/auto/Net/SSLeay/SSLeay.so(显然由系统Net :: SSLeay 1.34使用)以及本地安装的SSLeay.so供使用通过Net :: SSLeay 1.55。
您的本地Net :: SSLeay 1.55 SSLeay.so
不能位于系统路径中。它位于您的Carton本地路径中。
这应该给你编译版本:
$ strings /usr/lib64/perl5/auto/Net/SSLeay/SSLeay.so |grep ^1\.
=> 1.34
答案 1 :(得分:0)
运行perl v5.20.2和Net :: SSLeay 1.65随debian 8一起运行我看到了相同的行为。
如果您在Canton
中有SSLeay.pm,那么您还应该拥有共享对象文件,以及自动加载的索引文件和可自动加载的函数文件::
Canton/Net/SSLeay.pm
Canton/auto/Net/SSLeay/SSLeay.so
Canton/auto/Net/SSLeay/autosplit.ix
Canton/auto/Net/SSLeay/debug_read.al
...
通过Canton
或环境变量PERL5LIB将@INC
添加到use lib
之前,从那里加载.so文件等。您可以确保运行strace perl -Mlib=Canton -MNet::SSLeay -e 1 2>&1 | grep SSLeay
。
但如上所述,即使使用Net :: SSLeay 1.65,如果我在加载Net :: SSLeay之前设置die()
处理程序,我也会收到来自DynaLoader的$SIG{__DIE__}
消息。我这样沉默:
use Carp;
BEGIN {
$SIG{__DIE__} = \&Carp::croak;
}
...
# use Net::SSLeay; <-- this triggers the die message
BEGIN {
local $SIG{__DIE__};
my $mod = 'Net::SSLeay'; # or anything that uses N::S, e.g. Net::LDAP
my $ret = eval "use $mod; 1";
die "Can't load $mod: $@\n"
unless $ret;
}
这很麻烦,但至少它是解决这个问题的方法。