-1

我正在使用 5.16.1 的 perl 构建 Proc::ProcessTable

make的输出:

Skip blib/lib/Proc/ProcessTable.pm (unchanged)
Skip blib/lib/Proc/Killall.pm (unchanged)
Skip blib/lib/Proc/example.pl (unchanged)
Skip blib/lib/Proc/Killfam.pm (unchanged)
gmake[1]: Entering directory `/jxu/tmp/Proc-ProcessTable-0.45/Process'
Skip ../blib/lib/Proc/ProcessTable/Process.pm (unchanged)
Manifying ../blib/man3/Proc::ProcessTable::Process.3
gmake[1]: Leaving directory `/jxu/tmp/Proc-ProcessTable-0.45/Process'
gcc -c    -D_REENTRANT -fno-strict-aliasing -pipe  -DPERL_USE_SAFE_PUTENV -O    -DVERSION=\"0.45\"  -DXS_VERSION=\"0.45\" -fPIC "-I/opt/VRTSperl/lib/5.16.1/i86pc-solaris-thread-multi/CORE"  -DPROC_FS ProcessTable.c
gcc -c    -D_REENTRANT -fno-strict-aliasing -pipe  -DPERL_USE_SAFE_PUTENV -O    -DVERSION=\"0.45\"  -DXS_VERSION=\"0.45\" -fPIC "-I/opt/VRTSperl/lib/5.16.1/i86pc-solaris-thread-multi/CORE"  -DPROC_FS OS.c
Running Mkbootstrap for Proc::ProcessTable ()
chmod 644 ProcessTable.bs
rm -f blib/arch/auto/Proc/ProcessTable/ProcessTable.so
gcc  -G -L/usr/local/lib OS.o  ProcessTable.o  -o blib/arch/auto/Proc/ProcessTable/ProcessTable.so      \
        \

chmod 755 blib/arch/auto/Proc/ProcessTable/ProcessTable.so
cp ProcessTable.bs blib/arch/auto/Proc/ProcessTable/ProcessTable.bs
chmod 644 blib/arch/auto/Proc/ProcessTable/ProcessTable.bs
Manifying blib/man3/Proc::Killall.3
Manifying blib/man3/Proc::ProcessTable.3
Manifying blib/man3/Proc::Killfam.3

好像没问题。

make test的输出:

gmake[1]: Entering directory `/jxu/tmp/Proc-ProcessTable-0.45/Process'
gmake[1]: Leaving directory `/jxu/tmp/Proc-ProcessTable-0.45/Process'
PERL_DL_NONLAZY=1 /opt/VRTSperl/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/process.t .. Not a CODE reference at /opt/VRTSperl/lib/5.16.1/i86pc-solaris-thread-multi/DynaLoader.pm line 213.
END failed--call queue aborted at /jxu/tmp/Proc-ProcessTable-0.45/blib/lib/Proc/ProcessTable.pm line 213.
Compilation failed in require at t/process.t line 9.
BEGIN failed--compilation aborted at t/process.t line 9.
t/process.t .. Dubious, test returned 2 (wstat 512, 0x200)
Failed 3/3 subtests 

Test Summary Report
-------------------
t/process.t (Wstat: 512 Tests: 0 Failed: 0)
  Non-zero exit status: 2
  Parse errors: Bad plan.  You planned 3 tests but ran 0.
Files=1, Tests=0,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.04 cusr  0.00 csys =  0.08 CPU)
Result: FAIL
Failed 1/1 test programs. 0/0 subtests failed.
*** Error code 2
make: Fatal error: Command failed for target `test_dynamic'

谢谢 !

4

1 回答 1

0

这不是一个完整的答案。

错误是在 DynaLoader.pm 第 213 行报告的“不是代码参考”:

  boot:
    my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file);

    # See comment block above

    push(@dl_shared_objects, $file); # record files loaded

    &$xs(@args);   # <- line 213

这意味着返回的任何dl_install_xsub内容都不是 coderef。更具体地说,它不能是undef、数字或字符串,因为它们会导致不同的错误消息。因此$xs,此时包含一些其他类型的参考。

dl_install_xsub(DynaLoader 的一部分)是一个薄包装器newXS_flags(perl 的一部分)。newXS_flags返回一个CV *(perl 类型:指向“代码值”的指针)。在这一点上,我很困惑,因为我不知道这怎么可能导致非 coderef。

进一步调查的可能途径:使用 perl 调试器在 DynaLoader.pm 第 213 行放置一个断点并检查实际在 中的内容$xs,然后向后工作。

于 2013-01-15T09:06:06.013 回答