[Media_api] Can media_api Build PortMIDI under Visual C++ 2005 for Fun and Profit?

Peter Castine pcastine at gmx.net
Thu Apr 12 18:20:47 PDT 2007


I was going around in circles with the /TP and /clr (and variant)  
options, so I went back to a fresh copy of the Windows Forms project.  
I take it pm_dll.dll is still the recommended approach for PortMIDI  
on Windows, so I added #include "portmidi.h" to stadfx.h and followed  
the instructions at <http://msdn2.microsoft.com/en-us/library/ba1z7822 
(VS.80).aspx> to point the linker to pm_dll.lib (distinguishing  
between the appropriate versions of the .lib for my Debug & Release  
build configurations).

At that point the appliction built, but was obviously not calling any  
PM code yet. So I then added a call to Pm_Initialize() in with other  
initialization code in my Form1.h. Now I'm getting linker errors:

> test.obj : error LNK2028: unresolved token (0A000045) "extern "C"  
> enum PmError __cdecl Pm_Initialize(void)" (?Pm_Initialize@@$$J0YA? 
> AW4PmError@@XZ) referenced in function "public: __clrcall  
> test::Form1::Form1(void)" (??0Form1 at test@@$$FQ$AAM at XZ)
> test.obj : error LNK2019: unresolved external symbol "extern "C"  
> enum PmError __cdecl Pm_Initialize(void)" (?Pm_Initialize@@$$J0YA? 
> AW4PmError@@XZ) referenced in function "public: __clrcall  
> test::Form1::Form1(void)" (??0Form1 at test@@$$FQ$AAM at XZ)

I am confused about the __cdecl/__declspec business. MS documentation  
seems to want the DLL project to use the latter, but the PortMIDI  
project uses good, old-fashioned C storage-class attributes without  
the funky MS inventions. Pm_Initialize() should be implicitly extern,  
that's all.

Also, the linker diagnostics make it look as if the function name has  
been mangled despite the extern "C" declaration.

Is this stuff that I need to worry about?

Also, a question to Roger: does using the DLL approach mean that I do  
not need to explicitly call Pm_Terminate() in my own code? The DLL is  
supposed to clean up if my app crashes, so I'm extrapolating that it  
will clean up when my app exits normally. Or should I Pm_Terminate()  
anyway to be a good citizen?

I'm out for a few hours. Maybe someone can tell me I'm doin'  
somethin' stoopid in the meantime.-)

Thanks,
Peter



--------------    http://www.bek.no/~pcastine/Litter/    -------------
Peter Castine             +--> Litter Power & Litter Bundle for Jitter
                                Universal Binaries on the way
iCE:  Sequencing,  Recording &
       Interface  Building  for                   |home    | chez nous|
       Max/MSP   Extremely cool                   |bei uns |  i nostri|
       http://www.dspaudio.com/                   http://www.castine.de




More information about the media_api mailing list