Re: LibraryLink & MinGW
- To: mathgroup at smc.vnet.net
- Subject: [mg127020] Re: LibraryLink & MinGW
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov at ymail.com>
- Date: Sun, 24 Jun 2012 04:26:29 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <js3uag$um$1@smc.vnet.net>
On Sat, 23 Jun 2012 09:21:36 +0100, fortgriff <griff at eigenpt.com> wrote: > Does anyone have experience with LibraryLink and MinGW? > > Using LibraryLink, I am able to load functions into Mathematica from > the shipped version of demo.dll. From the source file demo.c, I > generate my own demogcc.dll (using MinGW). Using "objdump -f > xxx.dll", I cannot tell the difference between the two dlls. Both > export what they should and both look like dlls. > > Inside Mathematica, I cannot load functions from demogcc.dll. The > $LibraryError I get is > > Library load error 193: %1 is not a valid Win32 application. > > There are many command line options for the compiler and linker. > Hopefully, there is a combination that works. > Thank you for your help. > MWG > I don't know if there's enough information here to make a diagnosis, but I use MinGW-w64 with Mathematica and have had no problems with LibraryLink. That is, of course, after modifying the CCompilerDriver` package to support MinGW-w64 and regenerating the necessary import libraries in GNU COFF format. As I understand it the 32-bit MinGW should be able to link against MS COFF format import libraries, so I would have thought it would work "out of the box". However, I've never actually tried 32-bit MinGW so there may be some unforeseen problems. I will just describe what I did with MinGW-w64 and hopefully you can interpolate to your situation (or just copy what I did). I'm using TDM's MinGW-w64 build which you can download at <http://tdm-gcc.tdragon.net/download>. The actual executables in this package are all 32-bit and as this is a multilib build it's perfectly allowable to use this on either 32- or 64-bit systems. You do of course have to make sure that the word length of your compiled libraries matches that of the version of Mathematica you want to load them into. To produce the GNU COFF import libraries, you can use gendef from the MinGW-w64 tools (which you'll have to download separately from <http://sourceforge.net/projects/mingw-w64/> as it isn't included in TDM-GCC). Just compile that: gcc -O -Wall -I. gendef.c gendef_def.c compat_string.c fsredir.c -m32 -o gendef.exe Now you can run: gendef ml32i3.dll ml64i3.dll dlltool -d ml32i3.def -l libml32i3m.a -k -m i386 -f--32 dlltool -d ml64i3.def -l libml64i3m.a -m i386:x86-64 -f--64 del ml32i3.def ml64i3.def where ml32i3.dll is from SystemFiles\Links\MathLink\DeveloperKit\Windows\SystemAdditions and ml64i3.dll is from SystemFiles\Links\MathLink\DeveloperKit\Windows-x86-64\SystemAdditions. Then copy the new import libraries (libml32i3m.a and libml64i3m.a) to their proper locations and you're done. You'll need to do the same thing for WolframRTL.dll and WolframRTL_Minimal.dll, which are found in SystemFiles\Libraries\Windows (32-bit versions) and SystemFiles\Libraries\Windows-x86-64 (64-bit), to produce libWolframRTL.a and libWolframRTL_Minimal.a. If you want the static libraries too, WolframRTL_Static_Minimal.a can be obtained from WolframRTL_Static_Minimal.lib just by copying it under the new name and running ranlib on it (no need for gendef or dlltool in this case). After you've done this you should have all the necessary 32- and 64-bit GNU COFF import libraries in the right places. Next you need to look at the CCompilerDriver` package under AddOns\Applications\CCompilerDriver. The files needing modifications are CCompilerDriverRegistry.m and MinGWCompiler.m. I won't describe the modifications here because strictly speaking modifying these files contravenes Mathematica's licence, so all the standard legal mumbo-jumbo applies; do it only if this aspect of the licence is not legally enforceable in your jurisdiction, etc. etc. Suffice to say the necessary changes are quite minimal and should be fairly obvious. Now you should be able to compile the LibraryLink examples without a problem: Needs["CCompilerDriver`"]; (* Compile the 32-bit library: *) CreateLibrary[{"C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\SystemFiles\\Links\\LibraryLink\\LibraryResources\\Source\\demo_mathlink.c"}, "demo_mathlink_32", "TargetSystemID" -> "Windows", "ShellOutputFunction" -> Print]; (* Now the 64-bit one: *) CreateLibrary[{"C:\\Program Files\\Wolfram Research\\Mathematica\\8.0\\SystemFiles\\Links\\LibraryLink\\LibraryResources\\Source\\demo_mathlink.c"}, "demo_mathlink_64", "TargetSystemID" -> "Windows-x86-64", "ShellOutputFunction" -> Print]; (* If you have a 32-bit system: *) funReverse = LibraryFunctionLoad["demo_mathlink_32", "reverseString", LinkObject, LinkObject]; (* Or on 64-bit Windows: *) funReverse = LibraryFunctionLoad["demo_mathlink_64", "reverseString", LinkObject, LinkObject]; funReverse["a nut for a jar of tuna"] (* -> "anut fo raj a rof tun a" *) Obviously if you get any errors in the compiler output then fix them and try again. If you did everything correctly, you should now have MinGW-w64 fully working with CCompilerDriver`, LibraryLink`, etc.