www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Re: Mixing D and C - Windows

reply "DNewbie" <run3 myopera.com> writes:
Thank you both.

I've created a D DLL [http://dlang.org/dll.html], then I've loaded it from a C
program [compiled with dmc].
However, I'd want to be able to call it from a C program compiled with MSVC,
and I got a link error - unresolved external symbol [link testdll.obj
/implib:mydll.lib /out:testdll-msvc.exe]. The LoadLibrary works with both
DMC/MSVC, but it isn't 'handy'.?.



On Sat, Dec 31, 2011, at 07:20 PM, Exec wrote:
 Jakob Ovrum Wrote:
 As for loading C symbols in a DLL from a D program, you must link 
 against an import library of the DLL, and create an interface 
 module (similar to a header file) with the C declarations.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx

-- D
Jan 02 2012
next sibling parent reply Mike Parker <aldacron gmail.com> writes:
On 1/3/2012 10:02 AM, DNewbie wrote:
 Thank you both.

 I've created a D DLL [http://dlang.org/dll.html], then I've loaded it from a C
program [compiled with dmc].
 However, I'd want to be able to call it from a C program compiled with MSVC,
and I got a link error - unresolved external symbol [link testdll.obj
/implib:mydll.lib /out:testdll-msvc.exe]. The LoadLibrary works with both
DMC/MSVC, but it isn't 'handy'.?.

That's because the object file formats used by DMC and MSVC are different. DMC outputs OMF, MSCV uses COFF. If you download objconv[1], you can use it to convert between the two formats. Something like objconv -fcoff -nu mydll.lib mydll_mscv.lib should do the trick. [1] http://www.agner.org/optimize/objconv.zip
Jan 02 2012
parent Mike Parker <aldacron gmail.com> writes:
On 1/3/2012 12:43 PM, Mike Parker wrote:
 On 1/3/2012 10:02 AM, DNewbie wrote:
 Thank you both.

 I've created a D DLL [http://dlang.org/dll.html], then I've loaded it
 from a C program [compiled with dmc].
 However, I'd want to be able to call it from a C program compiled with
 MSVC, and I got a link error - unresolved external symbol [link
 testdll.obj /implib:mydll.lib /out:testdll-msvc.exe]. The LoadLibrary
 works with both DMC/MSVC, but it isn't 'handy'.?.

That's because the object file formats used by DMC and MSVC are different. DMC outputs OMF, MSCV uses COFF. If you download objconv[1], you can use it to convert between the two formats. Something like objconv -fcoff -nu mydll.lib mydll_mscv.lib should do the trick. [1] http://www.agner.org/optimize/objconv.zip

Or did you do that already? I just realized that would likely give a corrupt file error, not an unresolved symbol.
Jan 02 2012
prev sibling parent Andrej Mitrovic <andrej.mitrovich gmail.com> writes:
Maybe I'm wrong, but IIRC objconv won't work on import libs.

But there are other ways to do it: http://support.microsoft.com/kb/131313
Jan 02 2012