rvosa has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

on my continuing quest to bring the CORBA magic to Win32 I have taken to trying to build CORBA::ORBit v.0.4.7.

I am running ActivePerl v5.8.4 for MSWin32-x86-multi-thread, which is built using Microsoft Visual C++ 6.0. I reasoned that, in order to build this module, I should use MSVC++ too - although I have no prior experience with this program. I decided to give it a shot after numerous earlier aborted attempts using mingw gcc.

Anyway, so I unzip and untar the *.tar.gz for the module and start a new *.dll project in MSVC++. I add the C sources, the headers and the XS file to the project. I point MSVC++ to the right extra headers (i.e. those for orbit, the perl CORE headers and the glib headers).

I get a LOT of compiler errors, seemingly because for some reason both winsock2.h and winsock.h are imported. I work around this by telling <sys/socket.h> in the perl CORE headers to include winsock2.h instead of winsock.h (don't worry, I'll change it back as soon as I'm done).

Most compiler errors have gone away now. The ones remaining have me at the end of my wits, though. "cl.exe" seems to choke on the following code, and I can't see what's wrong with it:
#ifdef __cplusplus extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" void newCONSTSUB(HV *stash, char *name, SV *sv); #ifdef __cplusplus } #endif /* Graham Barr's Function for creating a constant subroutine. * From op.c in perl5.005_03 */ void newCONSTSUB(HV *stash, char *name, SV *sv) { U32 oldhints = hints; HV *old_cop_stash = curcop->cop_stash; HV *old_curstash = curstash; line_t oldline = curcop->cop_line; curcop->cop_line = copline; hints &= ~HINT_BLOCK_SCOPE; if(stash) curstash = curcop->cop_stash = stash; newSUB( start_subparse(FALSE, 0), newSVOP(OP_CONST, 0, newSVpv(name,0)), newSVOP(OP_CONST, 0, &sv_no), /* SvPV(&sv_no) == "" -- +GMB */ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) ); hints = oldhints; curcop->cop_stash = old_cop_stash; curstash = old_curstash; curcop->cop_line = oldline; }
I get the following errors:
c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +0) : error C2143: syntax error : missing ')' before '(' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +0) : error C2143: syntax error : missing ')' before '(' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +0) : error C2091: function returns function c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +0) : error C2091: function returns function c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +0) : error C2061: syntax error : identifier 'Perl_get_context' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +0) : error C2059: syntax error : ';' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +0) : error C2059: syntax error : ')' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +9) : error C2143: syntax error : missing ')' before '(' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +9) : error C2143: syntax error : missing ')' before '(' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +9) : error C2091: function returns function c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +9) : error C2091: function returns function c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +9) : error C2061: syntax error : identifier 'Perl_get_context' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +9) : error C2059: syntax error : ';' c:\documents and settings\rvosa\desktop\corba-orbit-0.4.7\constsub.c(1 +9) : error C2059: syntax error : ')'
I am completely stumped. As far as I can tell (which doesn't say much as I'm neither a C guru nor an MSVC++ guru) there's nothing wrong with the code. I built CORBA::ORBit straight from CPAN on OS X and linux and only with minor tweaks of the Makefile.PL on Cygwin.

Any ideas? Thanks!

Replies are listed 'Best First'.
Re: XS build panic
by demerphq (Chancellor) on Jun 23, 2005 at 17:36 UTC

    The thing that confuses me is that you are building XS inside of MSVS. Normally thats not how things work. Normally you let Perl make the DLL from the XS for you, without any participation of MSVS. Im not a guru either tho, so take this with a grain of salt.

    ---
    $world=~s/war/peace/g

Re: XS build panic
by samtregar (Abbot) on Jun 23, 2005 at 16:12 UTC
    I'm neither a C guru nor an MSVC++ guru

    This is a problem. Porting complex XS modules to Windows is not a job for a novice. Unfortunately there are very few people that actually are good at doing this, so I'm not sure you'll find good help here.

    But, if I'm all you've got, here's my guess - I bet it's a macro-expansion problem, so you need to look at the macro-expanded output. I don't even remember how to do that with gcc, nevermind MSVC++, but that's what I'd do. I'd be curious in particular about the stuff inside the call to newSub(). It looks excessively tricky from here.

    -sam