Thread overview | ||||||
---|---|---|---|---|---|---|
|
May 25, 2006 DLL | ||||
---|---|---|---|---|
| ||||
Hello I am just looking into this D language mostly just for fun, but seem to be unable to make a working DLL in D. I try to follow the instructions on the web side, but with no progress. I have copied the dll.d (where the dllmain is) and then i have a transform_d.d file looking like: import std.math; export void transform(double *x, double *y, double theta) { double c; double s; double x_tmp; x_tmp = *x; c = cos(theta); s = sin(theta); *x = x_tmp*c + *y*s; *y = *y*c - x_tmp*s; } and a .def file looking like LIBRARY "transform_d.dll" DESCRIPTION 'DLL written in D' EXETYPE NT CODE PRELOAD DISCARDABLE DATA PRELOAD SINGLE EXPORTS transform @2 To compile i use the command: dmd -oftransform_d.dll transform_d.d dll.d transform_d.def The compilation seem to go ok, but with the linker (which start automatically) i get the error message: OPTLINK (R) for Win32 Release 7.50B1 Copyright (C) Digital Mars 1989 - 2001 All Rights Reserved OPTLINK : Error 180: No Match Found for Export/ENTRY - : transform OPTLINK : Error 81: Cannot EXPORT : transform --- errorlevel 2 What am i doing wrong? thanks |
May 25, 2006 Re: DLL | ||||
---|---|---|---|---|
| ||||
Posted in reply to bsving | bsving wrote: > I have copied the dll.d (where the dllmain is) and then i have a transform_d.d > file looking like: > > import std.math; > > export void transform(double *x, double *y, double theta) > { > double c; > double s; > double x_tmp; > > x_tmp = *x; > c = cos(theta); > s = sin(theta); > *x = x_tmp*c + *y*s; > *y = *y*c - x_tmp*s; > } [...] > What am i doing wrong? > > thanks Try declaring transform as extern (C), i.e.: export extern (C) void transform(double *x, double *y, double theta) { // ... } -Kirk McDonald |
May 26, 2006 Re: DLL | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kirk McDonald | In article <e55f2s$rr7$1@digitaldaemon.com>, Kirk McDonald says... > >> >Try declaring transform as extern (C), i.e.: > >export extern (C) >void transform(double *x, double *y, double theta) { > // ... >} > >-Kirk McDonald WOW, thanks. it works like a charm. Just for the fun of it I was investigating if it was possible to write D DLLs to be used in LabVIEW, and yes it works. But why do i need this extern (C)? the web site at Digitalmars says nothing about that. |
May 26, 2006 Re: DLL | ||||
---|---|---|---|---|
| ||||
Posted in reply to bsving | bsving schreef:
> In article <e55f2s$rr7$1@digitaldaemon.com>, Kirk McDonald says...
>> Try declaring transform as extern (C), i.e.:
>>
>> export extern (C)
>> void transform(double *x, double *y, double theta) {
>> // ...
>> }
>>
>> -Kirk McDonald
>
> WOW, thanks. it works like a charm. Just for the fun of it I was investigating
> if it was possible to write D DLLs to be used in LabVIEW, and yes it works. But
> why do i need this extern (C)? the web site at Digitalmars says nothing about
> that.
>
>
Hello Kirk,
D normally mangles the names, into quite difficult to read object-file labels. So that you are able to do overloading, and having the same name in different modules. So this becomes possible:
module test1;
void transform(double *x);
module test2;
void transform(int[] y);
void transform(int[] y, int[] z);
Using the extern(C) directive eliminates the name mangling, making the object-file label looking like:
_transform
just as it would be in C
Regards,
Sjoerd
|
Copyright © 1999-2021 by the D Language Foundation