On Thursday, 21 January 2016 at 16:14:40 UTC, jmh530 wrote:
I'm trying to understand calling C libraries from D on Windows
with DMD. I made a simple example and compiled it with a static
library fine (so I've converted the .h file correctly). Then, I
compiled with gcc to a shared library (because I cannot for the
life of me figure out how to do this with DMC). I then used
implib to generate a .lib file (the fact that this is necessary
is not described nearly well enough in the documentation).
The next step is getting this to compile with dmd. I'm getting
an error that the function isn't getting called, which is
suggesting that I'm not linking the .lib file with DMD properly.
The dmd page
https://dlang.org/dmd-windows.html
explains that -L is used to pass stuff to the linker. It seems
to indicate that this should be the folder that the library is
in. The dll and lib files are in the same folder as the .d file
I'm trying to compile. So presumably, this should be -L. or
-L\. or like -LC:\folder\. But nothing like that works. There's
a link on the dmd page to optlink, which doesn't really help me
figure this out either. There's also some stuff about set LIB
in the sci.ini. Not sure I'm supposed to mess with that.
The LearningD book has some examples as well. I don't have it
in front of me right now, but I think I tried what they
recommend also. Nevertheless, I feel like the documentation
should be clear enough so that this isn't so frustrating.
You need to port the header file to d. i believe there's the htod
utility, however I haven't used that yet.
Then, basically all you have to do is to tell the linker to link
against your C .lib.
Remember that -LC:\folder (for dmd) passes "C:\folder" on to the
linker. Assuming the library folder flag for your linker is -L,
you'd want to use -L-LC:\folder.