执行perl Makefile.PL报错:无法找到net-snmp-config求助
perl Makefile.PL的报错问题 问题背景
我尝试安装NetSNMP-OID(版本5.0404),但在NetSNMP-OID目录下执行perl Makefile.PL时,触发了如下报错:
You need to install net-snmp first (I can't find net-snmp-config) at Makefile.PL line 91.
我通过在Makefile.PL中添加print语句排查后,发现代码的83-85行并未执行:
if (lc($opts->{'insource'}) eq "true") { $Params{'LIBS'} = "-L../../snmplib/.libs -L../../snmplib/ " . $Params{'LIBS'}; $Params{'CCFLAGS'} = "-I../../include " . $Params{'CCFLAGS'}; }
这直接导致了90-91行的报错逻辑被触发:
if ($Params{'LIBS'} eq "" || $Params{'CCFLAGS'} eq "") { die "You need to install net-snmp first (I can't find net-snmp-config)"; }
我已经安装了net-snmp 5.7.3,它位于我的主目录~/net-snmp-5.7.3/,怀疑是目录位置导致的问题。同时希望有Perl经验的朋友帮忙解释上述83-85行代码的作用。
操作系统:Raspbian
补充说明:net-snmp-config是net-snmp目录下的shell脚本,路径为~/net-snmp-5.7.3/net-snmp-config
解决方案
方法1:通过指定insource参数触发未执行的代码
既然83-85行是在insource参数为true时才执行,你可以在执行Makefile.PL时手动传入这个参数,同时确保NetSNMP-OID的目录结构符合代码中的相对路径要求:
perl Makefile.PL insource=true
不过要注意,代码里用的是../../snmplib和../../include,这意味着你的NetSNMP-OID目录应该放在net-snmp源码目录的子目录的子目录里,比如:
~/net-snmp-5.7.3/ └── some-subdir/ └── NetSNMP-OID-5.0404/
如果你的目录结构不是这样,这个参数可能无法生效。
方法2:手动指定net-snmp的路径
因为net-snmp-config已经存在,你可以让Perl脚本找到它,有两种方式:
- 将
net-snmp-config加入系统PATH:export PATH=$PATH:~/net-snmp-5.7.3/ perl Makefile.PL - 直接指定
net-snmp-config的路径:
查看Makefile.PL的参数选项,通常这类脚本支持指定--net-snmp-config参数,如果支持的话可以执行:perl Makefile.PL --net-snmp-config=~/net-snmp-5.7.3/net-snmp-config
方法3:手动修改Makefile.PL的参数
直接编辑Makefile.PL,把$Params{'LIBS'}和$Params{'CCFLAGS'}的值手动设置为你的net-snmp路径:
# 在报错逻辑之前添加 $Params{'LIBS'} = "-L~/net-snmp-5.7.3/snmplib/.libs -L~/net-snmp-5.7.3/snmplib/ " . $Params{'LIBS'}; $Params{'CCFLAGS'} = "-I~/net-snmp-5.7.3/include " . $Params{'CCFLAGS'};
然后再执行perl Makefile.PL。
83-85行代码的作用解释
这段代码是为了在net-snmp源码目录内编译NetSNMP-OID模块时使用的:
lc($opts->{'insource'}) eq "true":检查用户是否传入了insource=true的参数,lc()是把参数值转为小写,避免大小写问题。$Params{'LIBS'} = "-L../../snmplib/.libs -L../../snmplib/ " . $Params{'LIBS'}:添加net-snmp库文件的搜索路径(-L指定库目录),这里用相对路径是因为假设NetSNMP-OID放在net-snmp源码的子目录里,所以../..会回到net-snmp的根目录,找到snmplib下的库文件。$Params{'CCFLAGS'} = "-I../../include " . $Params{'CCFLAGS'}:添加net-snmp头文件的搜索路径(-I指定头文件目录),同样用相对路径找到net-snmp的include目录。
简单来说,这段代码是给模块编译时提供依赖的net-snmp库和头文件路径,专门用于在net-snmp源码内部编译该Perl模块的场景。
内容的提问来源于stack exchange,提问作者Ctrl S

