Dmake file error with Math::TrulyRandom module

2019-03-04 00:23发布

问题:

I listened to this one person's advice when I tried installing Math::TrulyRandom (A random number generator vs pseudorandom), I was running 'dmake' and he told me to ask about the errors on a different question.

My first question is here.

Here is what went wrong in the terminal:

C:\Users\Jlinne\Documents>                    cpanm --prompt Math::TrulyRandom
--> Working on Math::TrulyRandom
Fetching http://www.cpan.org/authors/id/G/GA/GARY/Math-TrulyRandom-1.0.tar.gz ... OK
Configuring Math-TrulyRandom-1.0 ... OK
Building and testing Math-TrulyRandom-1.0 ... Building Math-TrulyRandom-1.0 failed.
You can s)kip, r)etry, e)xamine build log, or l)ook ? [s] l
Entering C:/Users/Jlinne/.cpanm/work/1476593741.7660/Math-TrulyRandom-1.0 with C:\WINDOWS\system32\cmd.exe
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Users\Jlinne\.cpanm\work\1476593741.7660\Math-TrulyRandom-1.0>perl Makefile.PL
Generating a dmake-style Makefile
Writing Makefile for Math::TrulyRandom
Writing MYMETA.yml and MYMETA.json

C:\Users\Jlinne\.cpanm\work\1476593741.7660\Math-TrulyRandom-1.0>dmake
Skip blib\lib\Math\TrulyRandom.pm (unchanged)
Skip blib\lib\Math\TrulyRandom.pod (unchanged)
Running Mkbootstrap for Math::TrulyRandom ()
"C:\Strawberry\perl\bin\perl.exe" -MExtUtils::Command -e chmod -- 644 "TrulyRandom.bs"
gcc -c          -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2      -DVERSION=\"1.0\"        -DXS_VERSION=\"1.0\"  "-IC:\STRAWB~1\perl\lib\CORE"   TrulyRandom.c
gcc -c          -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2      -DVERSION=\"1.0\"        -DXS_VERSION=\"1.0\"  "-IC:\STRAWB~1\perl\lib\CORE"   truerand.c
truerand.c: In function 'tick':
truerand.c:57:19: error: storage size of 'it' isn't known
  struct itimerval it, oit;
                   ^
truerand.c:57:23: error: storage size of 'oit' isn't known
  struct itimerval it, oit;
                       ^
truerand.c:62:16: error: 'ITIMER_REAL' undeclared (first use in this function)
  if (setitimer(ITIMER_REAL, &it, &oit) < 0)
                ^
truerand.c:62:16: note: each undeclared identifier is reported only once for each function it appears in
truerand.c: In function 'interrupt':
truerand.c:71:16: error: 'SIGALRM' undeclared (first use in this function)
  (void) signal(SIGALRM, interrupt);
                ^
truerand.c: In function 'roulette':
truerand.c:86:16: error: 'SIGALRM' undeclared (first use in this function)
  (void) signal(SIGALRM, interrupt);
                ^
dmake:  Error code 129, while making 'truerand.o'

C:\Users\Jlinne\.cpanm\work\1476593741.7660\Math-TrulyRandom-1.0>

回答1:

Math::TrulyRandom is broken, and should not (indeed, cannot) be used.

It was written in 1996, and only works correctly on certain UNIX systems which existed at the time (like SunOS 4). It fails to generate random data on modern Linux systems, and cannot be compiled at all on Windows.

If you need a random number generator and rand won't cut it, look for another module. Math::Random::Secure or Crypt::Random, for instance.