2010/11/17 Erland Sommarskog <esq...@sommarskog.se>: > "Jan Dubois" (j...@activestate.com) writes: >> I suspect that you'll need to attach some complete example project >> that exhibits the things you are talking about before somebody else >> will try to reproduce/understand it. >> >> Right now the barrier to helping you is quite high! > > Okidoki. > > Here is TestInSummertime.pm: > > ------------------------------------------------------------------------ > package TestInSummertime; > > use strict; > use Exporter; > use DynaLoader; > > use vars qw(@ISA @EXPORT $VERSION); > > $VERSION = '1.000'; > > @ISA = qw(Exporter DynaLoader); > > bootstrap TestInSummertime; > > @EXPORT = qw(arraytest hashtest); > > > 1; > ---------------------------------------------------------------------- > > Here is TestInSummertime.xs: > > --------------------------------------------------------------------- > #include <windows.h> > > #include <EXTERN.h> > #include <perl.h> > #include <XSUB.h> > > > MODULE = TestInSummertime PACKAGE = TestInSummertime > > PROTOTYPES: ENABLE > > void > arraytest(arrayref) > SV * arrayref > CODE: > { > AV * av = (AV *) SvRV(arrayref); > SV ** svp = av_fetch(av, 0, 0); > SV * sv = *svp; > > SvGETMAGIC(sv); > > warn ("SvOK = %d\n", SvOK(sv)); > warn ("SvIV = %d\n", SvIV(sv)); > warn ("SvOK = %d\n", SvOK(sv)); > } > > void > hashtest(hashref) > SV * hashref > CODE: > { > HV * hv = (HV *) SvRV(hashref); > HE * he = hv_iternext(hv); > SV * sv = hv_iterval(hv, he); > > SvGETMAGIC(sv); > > warn ("SvOK = %d\n", SvOK(sv)); > warn ("SvIV = %d\n", SvIV(sv)); > warn ("SvOK = %d\n", SvOK(sv)); > } > ------------------------------------------------------------------- > > And here is makefile.pl > > ------------------------------------------------------------------- > use strict; > > use ExtUtils::MakeMaker; > > > WriteMakefile( > 'NAME' => 'TestInSummertime', > 'OBJECT' => 'TestInSummertime.obj', > 'CCFLAGS' => '-MT', > 'LIBS' => [":nosearch :nodefault delayimp.lib kernel32.lib " . > user32.lib ole32.lib oleaut32.lib uuid.lib " . > libcmt.lib"], > 'VERSION_FROM' => 'TestInSummertime.pm', > 'XS' => { 'TestInSummertime.xs' => 'TestInSummertime.cpp' } > ); > > sub MY::xs_c { > ' > .xs.cpp: > $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) > $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp > '; > } > -------------------------------------------------------------------- > > As posted, the project works, but if I comment out the #include of > windows.h, I get tons of errors, starting with: > > f:\perl\as1007-x86\lib\core\win32.h(341) : error C2061: syntax error : > identifier 'Stat_t' > f:\perl\as1007-x86\lib\core\win32.h(447) : error C2143: syntax error : > missing ',' before '*' > f:\perl\as1007-x86\lib\core\win32.h(447) : error C4430: missing type > specifier - int assumed. Note: C++ does not support default-int > > If I then comment out the line > > 'CCFLAGS' => '-MT' > > the project again builds successfully. This also adds all there options > to the compilation command: > > -nologo -GF -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE > -DNO_STRICT -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE > -DPRIVLIB_LAST_IN_INC -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS > -DUSE_PERLIO -DPERL_MSVCRT_READFIX > > And the question is what is to be considered best practice. > > I ActivePerl and the C++ compiler from Visual Studio 2005. (And the module > for which I am modifying makefile.pl requires this compiler, and this > version of the compiler.)
You are not allowed to overrride CCFLAGS and LIBS with simplier settings. You are compiling a perl extension, with perl headers so you have to use perl cflags and libs. The usual practrice is to add defines to CCFLAGS (but never -MT) and libs to LIBS, but never replace it. Check any Win32 XS Makefile.PL how to add to CCFLAGS and LIBS. In your case only libcmt.lib needs to be added out of my head. (not sure though) LIBS => ["libcmt.lib ".$Config{LIBS}], -- Reini Urban http://phpwiki.org/ http://murbreak.at/