How to access hs_free_fun_ptr from a Visual Studio DLL

Krasimir Angelov kr.angelov at gmail.com
Mon Mar 27 02:23:59 EST 2006


Hi Brian,

The problem is that hs_free_fun_ptr is defined in a static library
(the Haskell RTS) while you have declared it with
__declspec(dllimport). In this case the compiler is tring tp optimize
the call and it is using __imp__hs_free_fun_ptr instead of
hs_free_fun_ptr. You have to remove the dllimport pragma and to link
your program with the Haskell RTS library. Unfortunatelly the the
static library format is different for VC++ and GCC and I expect that
you may have problems if you try to statically link gcc code with VC++
code.

Cheers,
   Krasimir


2006/3/25, Brian Hulley <brianh at metamilk.com>:
> Hi -
> I have the following declaration and code in part of a DLL I'm writing:
>
>   extern "C" {
>        typedef void (*HsFunPtr)();
>       extern __declspec(dllimport) void hs_free_fun_ptr(HsFunPtr fp);
>   }
>
>   enum ECallback { ECallback_Render, ECallback_COUNT};
>
>   HsFunPtr callback[ECallback_COUNT];
>
>   void SetCallback(ECallback c, HsFunPtr fp){
>       if (callback[c]){
>          hs_free_fun_ptr(callback[c]);
>      }
>      callback[c] = fp;
>   }
>
> However when I try to build the DLL, I get the following error from Visual
> Studio:
>
>   Duma.obj : error LNK2019: unresolved external symbol
> __imp__hs_free_fun_ptr
>
> So the problem is that the VS is adding __imp__ onto the function name even
> though I've specified it as extern "C" and is moreover just ignoring the
> dllimport directive and complaining that it can't find the function.
>
> I've also tried deleting the "extern" before the "__declspec" but this
> doesn't make any difference. Also, I've tried putting hs_free_fun_ptr into
> the IMPORTS section of the def file but this doesn't make any difference
> either (I don't even think def files have an IMPORTS section so it's
> probably just being ignored).
>
> I've got a horrible feeling that VS will need a .lib file for ghc to allow
> it to link against hs_free_fun_ptr but I don't have a clue how to generate
> one...
>
> Does anyone know how I can get everything to link?
>
> Thanks, Brian.
>
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>


More information about the Glasgow-haskell-users mailing list