如何清除实现net-snmp代理时的perl脚本错误?

iqjalb3h  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(268)

我现在正在Ubuntu 16.04上实现net-snmp代理,通过引用此站点(https://kadionik.vvv.enseirb-matmeca.fr/embedded/snmp/english/net-snmp_english.html
但我在“4.2 NET-SNMP代理扩展”处停了下来
当我执行'perlMakefile.pl'时,会显示以下错误消息。(perl版本:第5.22.1节)
在MakefileSubs.pm@INC中找不到www.example.com(您可能需要安装MakefileSubs模块)(@INC包含:/etc/usr/local/lib/site_perl /usr/lib/arm-linux-gnueabihf/perl-base .)在生成文件的PL第7行。开始失败--编译在生成文件处中止。PL线7。
下面是Perl脚本。

use strict;
use warnings;
use ExtUtils::MakeMaker;
require 5;
use Config;
use Cwd 'abs_path';
use MakefileSubs;

my $lib_version;

WriteMakefile(DefaultStoreInitMakeParams());

sub DefaultStoreInitMakeParams {
    my $opts;
    my %Params = (
      'NAME'        => 'NetSNMP::default_store',
      'VERSION_FROM'    => 'default_store.pm', # finds $VERSION
      'XSPROTOARG'          => '-prototypes',
      );

AddCommonParams(\%Params);
              
my ($snmp_lib, $snmp_llib, $sep);

$opts = NetSNMPGetOpts();

if ($Config{'osname'} eq 'MSWin32' && !defined($ENV{'OSTYPE'})) {
  $sep = '\\';
  my $snmp_lib_file = 'netsnmp.lib';
  my $snmp_link_lib = 'netsnmp';
  my $lib_dir;

  if (lc($opts->{'debug'}) eq "true") {
    $lib_dir = 'lib\\debug';
  }
  else {
    $lib_dir = 'lib\\release';
  }
  
  if (lc($opts->{'insource'}) eq "true") {
$Params{'LIBS'} = "-L" . $MakefileSubs::basedir . "\\win32\\$lib_dir\\ -l$snmp_link_lib";
  }
  else {
my @LibDirs = split($Config{path_sep}, $ENV{LIB});
    my $LibDir;
if ($opts->{'prefix'}) {
  push (@LibDirs,"$ENV{'NET-SNMP-PATH'}${sep}lib");
}
my $noLibDir = 1;
while ($noLibDir) {
  $LibDir = find_files(["$snmp_lib_file"],\@LibDirs);
  if ($LibDir ne '') {
    $noLibDir = 0;
        # Put quotes around LibDir to allow spaces in paths
        $LibDir = '"' . $LibDir . '"';
  }
  else
  {
    @LibDirs = ();
    $LibDirs[0] = prompt("The Net-SNMP library ($snmp_lib_file) could not be found.\nPlease enter the directory where it is located:");
    $LibDirs[0] =~ s/\\$//;
  }
}
$Params{LIBS} = "-L$LibDir -l$snmp_link_lib";
  }
}
else {
$Params{'LIBS'}    = `$opts->{'nsconfig'} --libs` or
    die "net-snmp-config failed\n";
chomp($Params{'LIBS'});
    $lib_version = `$opts->{'nsconfig'} --version` or
    die "net-snmp-config failed\n";
if (lc($opts->{'insource'}) eq "true") {
    $Params{'LIBS'} =
            "-L" . abs_path("../../snmplib/.libs") .
            " -L" . abs_path("../../snmplib") .
            " " . $Params{'LIBS'};
}
}

return(%Params);
}

我已经检查了许多建议来解决这个问题,并安装了一些包,'libsnmp-perl','libnet-snmp-perl'.
但我至今还没有洗清这个问题。

eoxn13cs

eoxn13cs1#

net-snmp分发(不是Perl模块)有一个名为 perl/ 的目录,其中有一个 Makefile.PL。我假设您在这个目录中。在 perl/ 下,有一个名为 * MakefileSubs.pm * 的文件。对于要加载该文件的Perl程序,它需要知道在当前目录中查找 * MakefileSubs.pm *。当您看到错误消息时,您可以看到perl搜索的目录列表;看起来不像是.在那里。
顺便说一句,当前的工作目录.removed from the default module search path in Perl v5.26,但您使用的是较早的版本,看起来像是有人决定将一组不同的目录用作默认搜索路径。
一种方法是使用-I开关指定附加目录,并对当前目录使用.

$ perl -I. Makefile.PL

或者更有把握地说:

$ perl -I`pwd` Makefile.PL

您还可以将此目录添加到PERL 5LIB环境变量中,以便会话中得任何内容也将搜索该目录:

% export PERL5LIB = `pwd`:$PERL5LIB

如何在运行时将目录添加到包含路径(@INC)?

相关问题