Linking C library (.dll) to D on windows

Roman via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jan 26 01:54:41 PST 2015


On Monday, 26 January 2015 at 02:18:05 UTC, Mike Parker wrote:
> 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.

Many thanks Mike,

I've tried second option with MinGW generated dll
> implib /s module.lib module.dll

> dmd main.d module.lib

> main.exe

it prints:
 From C Dll 5

So it works !

P.S. I don't know why MinGW generated dll works, and I guess, 
that in more complicated dll, this can fail


More information about the Digitalmars-d-learn mailing list