Linking C library (.dll) to D on windows
Mike Parker via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Jan 25 18:18:03 PST 2015
On 1/26/2015 5:45 AM, Roman wrote:
> Stuff:
> 1. There are C code module.c and module.h
> 2. MinGW
> 3. DMD 2.066.1
> 4. Window 8.1
>
> module.c:
>
> #include "module.h"
> int add(int a, int b) {return a + b;}
>
> module.h:
>
> int add(int,int);
>
> I want to use function "add" from D
>
> so i call
>
>> cc -shared module.c -o module.dll
>
> Then D code
>
> main.d:
>
> import std.stdio;
>
> extern(C)
> {
> int add(int a, int b);
> }
>
> void main()
> {
> writefln("From C Dll %d",add(2,3));
> }
>
>
> So how i should compile with dmd, to get this work?
>
>> dmd main.d -L=module.dll
>
> prints:
> OPTLINK (R) for Win32 Release 8.00.15
> Copyright (C) Digital Mars 1989-2013 All rights reserved.
> http://www.digitalmars.com/ctg/optlink.html
> OPTLINK : Error 8: Illegal Filename
> main,,nul,user32+kernel32/noi=module.dll;
>
> ^
> --- errorlevel 1
>
> I've tried to found smthing here
> http://wiki.dlang.org/Compiling_and_linking_with_DMD_on_Windows
> but dll tutorial is missing
>
> So does DMD available to link dll files?
Problem #1: linking directly to dlls is not common in the Windows
ecosystem. AFAIK, MinGW is the only toolchain that supports that. By
default, DMD uses the OPTLINK linker for 32-bit apps and uses the MS
linker for 64-bit, neither of which have the ability to link directly
with dlls. You need an import library.
Problem #2: OPTLINK only understands the OMF format for object files,
whereas MinGW and the MS compiler output COFF. So you have three options
for linking with 32-bit DMD:
* Compile with the Digital Mars C/C++ compiler (DMC) and generate an
import library along with the dll.
* Compile with another compiler and run implib (part of the free Basic
Utilities Package from Digital Mars, downloadable from [1]) on the dll
to generate an import library in OMF format.
* Load the DLL dynamically, then you don't need an import library.
extern( C ) alias addptr = int function(int, int);
addptr add;
auto handle = LoadLibrary( "MyLib.dll" );
add = cast( addptr )GetProcAddress( handle, "add" );
Alternatively, you could compile as 64-bit, generate an import library
with the DLL when you compile it with MinGW, and link directly with the
import lib (the next version of DMD will support COFF for 32-bit).
However, I have had trouble attempting to link static MinGW libraries
with 64-bit DMD. Some have worked, some haven't. An import library is
not the same and I assume it would work, but I've never tried.
Then again, since 64-bit DMD requires the MS toolchain to be installed,
another option is to forego MinGW and use the MS compiler instead.
More information about the Digitalmars-d-learn
mailing list