0

When I am trying to install FFI::Platypus on straweberry perl 5.28.1 I get the below messsage. Any idea what might be wrong?

xs/windl.o:windl.c:(.text+0x12c): undefined reference to `EnumProcessModules'
xs/windl.o:windl.c:(.text+0x185): undefined reference to `GetModuleFileNameExA'
collect2.exe: error: ld returned 1 exit status
gmake: *** [Makefile:529: blib\arch\auto\FFI\Platypus\Platypus.xs.dll] Error 1
  PLICEASE/FFI-Platypus-0.86.tar.gz
  "C:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\c\bin\gmake.exe" -- NOT OK
Stopping: 'install' failed for 'FFI::Platypus'.
Failed during this command:
 PLICEASE/FFI-Platypus-0.86.tar.gz            : make NO

also here are the linker steps on the installation

gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include \
-s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2 \
  -DVERSION=\"0.86\" \
-DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   lib/FFI/Platypus.c -o lib/FFI/Platypus.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/closure.c -o xs/closure.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/complex.c -o xs/complex.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/custom.c -o xs/custom.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/havepm.c -o xs/havepm.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/meta.c -o xs/meta.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/names.c -o xs/names.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/perl_math_int64.c -o xs/perl_math_int64.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/record_opaque.c -o xs/record_opaque.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/record_simple.c -o xs/record_simple.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/record_string.c -o xs/record_string.o
gcc -c  -Iinclude -IC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../include -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE -D__USE_MINGW_ANSI_STDIO -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -fwrapv -fno-strict-aliasing -mms-bitfields -s -O2   -DVERSION=\"0.86\" -DXS_VERSION=\"0.86\"  "-IC:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE"   xs/windl.c -o xs/windl.o
"C:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\bin\perl.exe" -MExtUtils::Mksymlists \
     -e "Mksymlists('NAME'=>\"FFI::Platypus\", 'DLBASE' => 'Platypus', 'DL_FUNCS' => {  }, 'FUNCLIST' => [], 'IMPORTS' => {  }, 'DL_VARS' => [], 'FILE' => q[lib/FFI/Platypus]);"
g++.exe lib/FFI/Platypus.def -o blib\arch\auto\FFI\Platypus\Platypus.xs.dll -LC:/Dev/OPENSO~1/Perl/STRAWB~1.1-6/c/lib/PKGCON~1/../../lib/../lib -mdll -s -L"C:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE" -L"C:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\c\lib" lib/FFI/Platypus.o xs/closure.o xs/complex.o xs/custom.o xs/havepm.o xs/meta.o xs/names.o xs/perl_math_int64.o xs/record_opaque.o xs/record_simple.o xs/record_string.o xs/windl.o   "C:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\perl\lib\CORE\libperl528.a" "C:\Dev\OPENSO~1\Perl\STRAWB~1.1-6\c\lib\PKGCON~1\..\..\lib\..\lib\libffi.a" -Wl,--enable-auto-image-base
jsor
  • 637
  • 4
  • 10
  • `EnumProcessModules` and `GetModuleFileNameExA` are Windows API functions. I'm guessing from the API documentation that `-lKernel32` is missing from the linker command line. The linker command line is unfortunately not visible in your question. – Stefan Becker Mar 20 '19 at 05:55

1 Answers1

3

From the linker error message (missing symbols EnumProcessModules and GetModuleFileNameExA which are Windows API functions) it is clear that the library kernel32 is missing. The linker command line shown in your update proves that.

The update also shows that you have installed Strawberry Perl under a path that contains spaces:

"C:\Dev\OpenSource Tools\Perl\strawberry-perl-5.28.1.1-64bit-portable\...

Using paths with characters that have special meanings, like space (), hash (#), etc., is always asking for trouble. In this particular case it leads to a build that can't find any libraries:

...
Configuring FFI-Platypus-0.86 ... using system libffia via PkgConfigPP
Checking if your kit is complete...
Looks good
Warning (mostly harmless): No library found for -lpsapi
Warning (mostly harmless): No library found for -lmoldname
Warning (mostly harmless): No library found for -lkernel32
Warning (mostly harmless): No library found for -luser32
Warning (mostly harmless): No library found for -lgdi32
Warning (mostly harmless): No library found for -lwinspool
Warning (mostly harmless): No library found for -lcomdlg32
Warning (mostly harmless): No library found for -ladvapi32
Warning (mostly harmless): No library found for -lshell32
Warning (mostly harmless): No library found for -lole32
Warning (mostly harmless): No library found for -loleaut32
Warning (mostly harmless): No library found for -lnetapi32
Warning (mostly harmless): No library found for -luuid
Warning (mostly harmless): No library found for -lws2_32
Warning (mostly harmless): No library found for -lmpr
Warning (mostly harmless): No library found for -lwinmm
Warning (mostly harmless): No library found for -lversion
Warning (mostly harmless): No library found for -lodbc32
Warning (mostly harmless): No library found for -lodbccp32
Warning (mostly harmless): No library found for -lcomctl32
Generating a gmake-style Makefile
...

Unfortunately the warning is not "mostly harmless", because it leads to a linker command line without e.g. -lkernel32 and hence the linker error.

Solution: rename the directories in the path to remove any spaces, e.g.

C:\Dev\OpenSource_Tools\...

Original answer The github project for FFI::Platypus shows that the author is running a CI build for Strawberry Perl. So one thing to check would be to follow the build instructions in that CI build:

cpanm Capture::Tiny ExtUtils::MakeMaker ExtUtils::ParseXS IPC::Cmd
cpanm FFI::Platypus

You might also want to compare your build log to one of the FFI::Platypus CI Builds on AppVeyor to discover differences.

Stefan Becker
  • 5,695
  • 9
  • 20
  • 30
  • Just tried on my Windows 10 64-bit VM: (a) download & unpack Strawberry Perl 5.28.1.1 portable zip file, (b) opened `portableshell` and (c) entered the two command lines from my solution. Module build goes through without a hitch and `perl -MFFI::Platypus -e 1` runs without error message afterwards. – Stefan Becker Mar 20 '19 at 06:54
  • I tried the instructions but still get the same error , i added more info about the installation if you want to look thanks . – jsor Mar 20 '19 at 12:56
  • 1
    I've now verified that the space in the path name is the cause for your error. I've updated my answer accordingly. I would suggest to always use `cpanm -v ...` in the future and checking for warnings in the output. – Stefan Becker Mar 21 '19 at 06:09