[racket] FFI on Windows
At Sun, 27 Nov 2011 18:20:46 -0500, Harry Spier wrote:
> Dear list members,
> On going through the article on the FFI by Eli Barzilay and Dmitry Orlovsky
> http://www.ccs.neu.edu/scheme/pubs/scheme04-bo.pdf
>
> It says:
> "libffi is maintained and distributed as part of the GCC project,
> but its goal is to provide a portable library. We use it for all
> platforms that PLT Scheme targets, including Windows (using a
> slightly adapted version that works with Microsoft’s compiler, courtesy
> of the Thomas Heller [13])."
(Racket now uses the main libffi sources for Windows, too.)
> Does that mean that if I'm using the Windows version of Racket and I want
> to use the FFI to interface to ImageMagick, that the ImageMagick Windows
> executable must also be compiled with the microsoft C compiler rather than
> with MingW GCC ?
No.
> A few years ago when I interfaced ImageMagick to Ruby using Ruby's
> ImageMagick interface "RMagick" there was a problem for a while about
> RMagick being compiled with Microsoft Visual C compiler (it may have been a
> particular version of the Visual C compiler?) and I think the ImageMagick
> executable for windows was compiled with MingW GCC. The problem was
> resolved when the RMagick interface was compiled using the same compiler as
> ImageMagick.
That sounds like an issue with mismatched C runtime libraries.
The main way a mismatch can show up with Racket's FFI is when a foreign
function allocates a value, and the caller is supposed to free it with
free(). In that case, calling the Racket `free' function may not work,
because it may use a different memory allocator from the one linked to
the foreign library --- i.e., different instances of malloc() and
free() from different C libraries.
Most libraries that provide allocation functions also provide
corresponding deallocation functions instead of relying on free(), and
that avoids the problem. Meanwhile, Racket uses "msvcrt.dll" as its C
runtime library, which is consistent with most binary distributions of
open-source software. I believe that MinGW binaries by default use
"msvcrt.dll".
For all of those reasons, you probably won't run into problems due to a
compiler mismatch when using Racket's FFI.