in reply to Attempt to embed Perl in C on Windows

Strangely, your code built with MSVC and perl5.10 builds clean and runs perfectly:

C:\test>cl /W3 hello.c -DWIN32 -I"C:\Perl64\lib\CORE" C:\Perl64\lib\C +ORE\perl510.lib Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64 Copyright (C) Microsoft Corporation. All rights reserved. hello.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:hello.exe hello.obj C:\Perl64\lib\CORE\perl510.lib C:\test>.\hello.exe hello.pl Hello from MSWin32 5.010001 C:\test>type hello.pl #! perl -slw use strict; print "Hello from $^O $]\n"; C:\test>

Built with gcc and 5.18 it builds clean(ish) and runs without crashing, but simply does nothing:

C:\test>gcc_bld_hello.c.pl18 Building Hello gcc -Wall -mwindows -o hello hello.c -s -O2 -DWIN32 -DWIN64 -DCONSER +VATIVE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLIC +IT_SYS -DUSE_PERLIO -fno-strict-aliasing -mms-bitfields -I"C:\Perl5. +18\perl\lib\CORE" -s -L"C:\Perl5.18\perl\lib\CORE" -L"C:\Perl5.18\ +c\lib" C:\Perl5.18\perl\lib\CORE\libperl518.a C:\Perl5.18\c\x86_64-w +64-mingw32\lib\libmoldname.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\lib +kernel32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libuser32.a C:\Perl5. +18\c\x86_64-w64-mingw32\lib\libgdi32.a C:\Perl5.18\c\x86_64-w64-mingw +32\lib\libwinspool.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libcomdlg32 +.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libadvapi32.a C:\Perl5.18\c\x +86_64-w64-mingw32\lib\libshell32.a C:\Perl5.18\c\x86_64-w64-mingw32\l +ib\libole32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\liboleaut32.a C:\P +erl5.18\c\x86_64-w64-mingw32\lib\libnetapi32.a C:\Perl5.18\c\x86_64-w +64-mingw32\lib\libuuid.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libws2_ +32.a C:\Perl5.18\c\x86_64-w64-min gw32\lib\libmpr.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libwinmm.a C:\P +erl5.18\c\x86_64-w64-mingw32\lib\libversion.a C:\Perl5.18\c\x86_64-w6 +4-mingw32\lib\libodbc32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libodb +ccp32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libcomctl32.a In file included from C:\Perl5.18\perl\lib\CORE/sys/socket.h:180:0, from C:\Perl5.18\perl\lib\CORE/win32.h:386, from C:\Perl5.18\perl\lib\CORE/win32thread.h:4, from C:\Perl5.18\perl\lib\CORE/perl.h:2869, from hello.c:2: C:\Perl5.18\perl\lib\CORE/win32.h:391:26: warning: "/*" within comment + [-Wcomment] C:\Perl5.18\perl\lib\CORE/win32.h:392:33: warning: "/*" within comment + [-Wcomment] In file included from C:\Perl5.18\perl\lib\CORE/win32thread.h:4:0, from C:\Perl5.18\perl\lib\CORE/perl.h:2869, from hello.c:2: C:\Perl5.18\perl\lib\CORE/win32.h:391:26: warning: "/*" within comment + [-Wcomment] C:\Perl5.18\perl\lib\CORE/win32.h:392:33: warning: "/*" within comment + [-Wcomment] C:\test>.\hello.exe hello.pl18 C:\test>type hello.pl18 #! perl -slw use strict; print "Hello from $^O $]\n"; C:\test>gcc_bld_hello.c.pl18

And oddly, if I add a printf() at the top of the code:

#include <EXTERN.h> #include <perl.h> EXTERN_C void xs_init (pTHX); EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); EXTERN_C void boot_Win32CORE (pTHX_ CV* cv); EXTERN_C void xs_init(pTHX) { char *file = __FILE__; dXSUB_SYS; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); newXS("Win32CORE::bootstrap", boot_Win32CORE, file); } static PerlInterpreter *my_perl; /*** The Perl interpreter ***/ int main(int argc, char **argv, char **env) { printf( "So far, so good!\n" ); PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse(my_perl, NULL, argc, argv, (char **)NULL); perl_run(my_perl); perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); return 0; }

It still outputs nothing at all:

C:\test>gcc_bld_hello.c.pl18 Building Hello gcc -Wall -mwindows -o hello hello.c -s -O2 -DWIN32 -DWIN64 -DCONSER +VATIVE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLIC +IT_SYS -DUSE_PERLIO -fno-strict-aliasing -mms-bitfields -I"C:\Perl5. +18\perl\lib\CORE" -s -L"C:\Perl5.18\perl\lib\CORE" -L"C:\Perl5.18\ +c\lib" C:\Perl5.18\perl\lib\CORE\libperl518.a C:\Perl5.18\c\x86_64-w +64-mingw32\lib\libmoldname.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\lib +kernel32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libuser32.a C:\Perl5. +18\c\x86_64-w64-mingw32\lib\libgdi32.a C:\Perl5.18\c\x86_64-w64-mingw +32\lib\libwinspool.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libcomdlg32 +.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libadvapi32.a C:\Perl5.18\c\x +86_64-w64-mingw32\lib\libshell32.a C:\Perl5.18\c\x86_64-w64-mingw32\l +ib\libole32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\liboleaut32.a C:\P +erl5.18\c\x86_64-w64-mingw32\lib\libnetapi32.a C:\Perl5.18\c\x86_64-w +64-mingw32\lib\libuuid.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libws2_ +32.a C:\Perl5.18\c\x86_64-w64-min gw32\lib\libmpr.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libwinmm.a C:\P +erl5.18\c\x86_64-w64-mingw32\lib\libversion.a C:\Perl5.18\c\x86_64-w6 +4-mingw32\lib\libodbc32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libodb +ccp32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libcomctl32.a In file included from C:\Perl5.18\perl\lib\CORE/sys/socket.h:180:0, from C:\Perl5.18\perl\lib\CORE/win32.h:386, from C:\Perl5.18\perl\lib\CORE/win32thread.h:4, from C:\Perl5.18\perl\lib\CORE/perl.h:2869, from hello.c:2: C:\Perl5.18\perl\lib\CORE/win32.h:391:26: warning: "/*" within comment + [-Wcomment] C:\Perl5.18\perl\lib\CORE/win32.h:392:33: warning: "/*" within comment + [-Wcomment] In file included from C:\Perl5.18\perl\lib\CORE/win32thread.h:4:0, from C:\Perl5.18\perl\lib\CORE/perl.h:2869, from hello.c:2: C:\Perl5.18\perl\lib\CORE/win32.h:391:26: warning: "/*" within comment + [-Wcomment] C:\Perl5.18\perl\lib\CORE/win32.h:392:33: warning: "/*" within comment + [-Wcomment] C:\test>.\hello.exe hello.pl18 C:\test>

I can't even begin to work out why that is. (I've yet to earn my Master's in -reading_stupidly_long_options -and_working_out_what_the_fcuk_they_are_meant_to_do. :)


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: Attempt to embed Perl in C on Windows
by bulk88 (Priest) on Dec 22, 2014 at 02:01 UTC
    Perl usually hooks libc stuff like printf and malloc on win32 to make very old thread-unsafe XS code, thread-safe (the effort usually fails). Do a #undef printf to get back the real printf and not a hook into perl.
      Perl usually hooks libc stuff like printf and malloc on win32 to make very old thread-unsafe XS code, thread-safe (the effort usually fails). Do a #undef printf to get back the real printf and not a hook into perl.

      Wouldn't that affect the msvc build as well as the gcc build?

      Anyhow, I tried it:

      #include <EXTERN.h> #include <perl.h> EXTERN_C void xs_init (pTHX); EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); EXTERN_C void boot_Win32CORE (pTHX_ CV* cv); EXTERN_C void xs_init(pTHX) { char *file = __FILE__; dXSUB_SYS; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); newXS("Win32CORE::bootstrap", boot_Win32CORE, file); } #undef printf static PerlInterpreter *my_perl; /*** The Perl interpreter ***/ int main(int argc, char **argv, char **env) { printf( "So far, so good!\n" ); PERL_SYS_INIT3(&argc,&argv,&env); my_perl = perl_alloc(); perl_construct(my_perl); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse(my_perl, NULL, argc, argv, (char **)NULL); perl_run(my_perl); perl_destruct(my_perl); perl_free(my_perl); PERL_SYS_TERM(); return 0; }

      And still the gcc build produces no output:

      C:\test>gcc_bld_hello.c.pl18 Building Hello gcc -Wall -mwindows -o hello hello.c -s -O2 -DWIN32 -DWIN64 -DCONSER +VATIVE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLIC +IT_SYS -DUSE_PERLIO -fno-strict-aliasing -mms-bitfields -I"C:\Perl5. +18\perl\lib\CORE" -s -L"C:\Perl5.18\perl\lib\CORE" -L"C:\Perl5 gw32\lib\libmpr.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libwinmm.a C:\P +erl5.18\c\x86_64-w64-mingw32\lib\libversion.a C:\Perl5.18\c\x86_64-w6 +4-mingw32\lib\libodbc32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libodb +ccp32.a C:\Perl5.18\c\x86_64-w64-mingw32\lib\libcomctl32.a In file included from C:\Perl5.18\perl\lib\CORE/sys/socket.h:180:0, from C:\Perl5.18\perl\lib\CORE/win32.h:386, from C:\Perl5.18\perl\lib\CORE/win32thread.h:4, from C:\Perl5.18\perl\lib\CORE/perl.h:2869, from hello.c:2: C:\Perl5.18\perl\lib\CORE/win32.h:391:26: warning: "/*" within comment + [-Wcomment] C:\Perl5.18\perl\lib\CORE/win32.h:392:33: warning: "/*" within comment + [-Wcomment] In file included from C:\Perl5.18\perl\lib\CORE/win32thread.h:4:0, from C:\Perl5.18\perl\lib\CORE/perl.h:2869, from hello.c:2: C:\Perl5.18\perl\lib\CORE/win32.h:391:26: warning: "/*" within comment + [-Wcomment] C:\Perl5.18\perl\lib\CORE/win32.h:392:33: warning: "/*" within comment + [-Wcomment] C:\test>.\hello.exe hello.pl18 C:\test>.\hello.exe hello.pl18 C:\test>

      Whereas the cl build does what is expected:

      C:\test>cl /W3 hello.c -DWIN32 -I"C:\Perl64\lib\CORE" C:\Perl64\lib\C +ORE\perl510.lib Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64 Copyright (C) Microsoft Corporation. All rights reserved. hello.c Microsoft (R) Incremental Linker Version 9.00.21022.08 Copyright (C) Microsoft Corporation. All rights reserved. /out:hello.exe hello.obj C:\Perl64\lib\CORE\perl510.lib C:\test>.\hello.exe hello.pl So far, so good! Hello from MSWin32 5.010001

      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        Downloaded MS SDK for Windows, run into issue: http://stackoverflow.com/questions/1901279/windows-7-sdk-installation-failure , solved as described, found that command-line compiler is not here anymore, downloaded Visual c++ Express Edition, run your example from above, found that there is a difference with perl 5.10 in comparison to 5.16, though found also that the file perl510.lib is not available with strawberry perl, despaired, then found an old 5.12-installation of ActivePerl with perl512.lib, run the example again, found that one should start vc command line with admin rights otherwise hello.proj cannot be read, run it again ... - and it worked!!!

        Some questions if I dare :-):

        How to set the output to a project directory (now the .exe is being saved in C:/windows/system32 which is not a good thing)?

        How to bind the perl source file at the time of compiling (my naive attempt in the OP with setting argv does not work)?

        In any case - Many Thanks!!! BrowserUK, it was a rare sense of achievement in the passing year for me!

        After further experimenting: Update:

        The perl source file can be included if provided with full path with double backslash.

        Am I right that the lib folder from the project can be included for cl compiler on its command-line? The attempt with an empty lib folder produced no error.

        I still cannot redirect the output of the cl compiler to the project folder :-(