View mode: basic / threaded / horizontal-split · Log in · Help
August 17, 2004
linking with C libraries
Hi, everyone!
I am starting to use D, and I am very excited about it.

It's said that D program can call C functions directly. That's great, and I
understand how to convert *.h into *.d. My question is: What kinds of C library
files can be used (in linking stage)? I did not find the answer in D's HTML
docs. dmd's link.exe does not accept my C libraries with message
" Error 43: Not a Valid Library File"

More specific. Suppose I have a C library with source, and I want to use it in
my D project. The library is big and complex enough and has unique
functionality, which I don't want to port into D myself. (I am now talking about
FreeType). Which compiler and linker (for dll) I should use to produce .lib
which I can link to my D program? I use DJGPP, MinGW, Cygwin, MSVC, Intel C++,
and Metrowerks, all under Windows. (And FreeType works just fine with all of
them in my C/C++ programs).

Thanks a lot!

Aura
August 17, 2004
Re: linking with C libraries
In article <cfs6ku$onq$1@digitaldaemon.com>, Aureliano says...
>
>Hi, everyone!
>I am starting to use D, and I am very excited about it.
>
>It's said that D program can call C functions directly. That's great, and I
>understand how to convert *.h into *.d. My question is: What kinds of C library
>files can be used (in linking stage)? I did not find the answer in D's HTML
>docs. dmd's link.exe does not accept my C libraries with message
>" Error 43: Not a Valid Library File"
>
>More specific. Suppose I have a C library with source, and I want to use it in
>my D project. The library is big and complex enough and has unique
>functionality, which I don't want to port into D myself. (I am now talking about
>FreeType). Which compiler and linker (for dll) I should use to produce .lib
>which I can link to my D program? I use DJGPP, MinGW, Cygwin, MSVC, Intel C++,
>and Metrowerks, all under Windows. (And FreeType works just fine with all of
>them in my C/C++ programs).
>
>Thanks a lot!
>
>Aura
>
>
I hope this helps:
convert your .h files to .d.

extern (C):
void c_lib_function(/* arguments */);
// other functions

Then, you can use them in your D file like normal.
Use a command similar to this to compile your D program:

dmd d_file.d your_c_lib.lib

OK? If you're .lib file doesn't work... then I don't know what to do!
August 17, 2004
Re: linking with C libraries
In article <cfsb7d$r2l$1@digitaldaemon.com>, anon says...

>I hope this helps:
>convert your .h files to .d.
>
>extern (C):
>void c_lib_function(/* arguments */);
>// other functions
>
>Then, you can use them in your D file like normal.
>Use a command similar to this to compile your D program:
>
>dmd d_file.d your_c_lib.lib
>
>OK? If you're .lib file doesn't work... then I don't know what to do!

The .lib does not work. There should be some specified way to produce C .libs,
linkable by D's link.exe. When I try to supply .lib, produced by MinGW's
'ar.exe' or by MSVC's 'lib.exe', DMD's link.exe does not accept it.
Thanks for answering, anyway!

Aura
August 17, 2004
Re: linking with C libraries
You are probably trying to link with .LIB files from the wrong C 
compiler. DigitalMars D uses the same back-end and binary tools as 
DigitalMars C and C++, so these tools have to be used, because the file 
format differs severely from that of Microsoft and MinGW.

Please refer to DMC Compiler and Tools guide from the DigitalMars 
website on help how to create stub .LIBs from DLLs using implib (basic 
tools package). If you want a static library, recompile it with DMC, or 
you can try the commercial advanced utilities package COFF2OMF.

-eye

Aureliano schrieb:

> Hi, everyone!
> I am starting to use D, and I am very excited about it.
> 
> It's said that D program can call C functions directly. That's great, and I
> understand how to convert *.h into *.d. My question is: What kinds of C library
> files can be used (in linking stage)? I did not find the answer in D's HTML
> docs. dmd's link.exe does not accept my C libraries with message
> " Error 43: Not a Valid Library File"
> 
> More specific. Suppose I have a C library with source, and I want to use it in
> my D project. The library is big and complex enough and has unique
> functionality, which I don't want to port into D myself. (I am now talking about
> FreeType). Which compiler and linker (for dll) I should use to produce .lib
> which I can link to my D program? I use DJGPP, MinGW, Cygwin, MSVC, Intel C++,
> and Metrowerks, all under Windows. (And FreeType works just fine with all of
> them in my C/C++ programs).
> 
> Thanks a lot!
> 
> Aura
> 
>
August 17, 2004
Re: linking with C libraries
In article <cfslti$v7l$1@digitaldaemon.com>, Aureliano says...
>
>In article <cfsb7d$r2l$1@digitaldaemon.com>, anon says...
>
>>I hope this helps:
>>convert your .h files to .d.
>>
>>extern (C):
>>void c_lib_function(/* arguments */);
>>// other functions
>>
>>Then, you can use them in your D file like normal.
>>Use a command similar to this to compile your D program:
>>
>>dmd d_file.d your_c_lib.lib
>>
>>OK? If you're .lib file doesn't work... then I don't know what to do!
>
>The .lib does not work. There should be some specified way to produce C .libs,
>linkable by D's link.exe. When I try to supply .lib, produced by MinGW's
>'ar.exe' or by MSVC's 'lib.exe', DMD's link.exe does not accept it.
>Thanks for answering, anyway!
>
>Aura
>
>
Try using DM's lib.exe (\dm\bin\lib.exe).
Very simple:
lib -c my.lib my.objs ...

You can make C & D libraries with it.
August 18, 2004
Re: linking with C libraries
"Aureliano" <gazer@pisem.net> wrote in message
news:cfslti$v7l$1@digitaldaemon.com...
> In article <cfsb7d$r2l$1@digitaldaemon.com>, anon says...
>
> >I hope this helps:
> >convert your .h files to .d.
> >
> >extern (C):
> >void c_lib_function(/* arguments */);
> >// other functions
> >
> >Then, you can use them in your D file like normal.
> >Use a command similar to this to compile your D program:
> >
> >dmd d_file.d your_c_lib.lib
> >
> >OK? If you're .lib file doesn't work... then I don't know what to do!
>
> The .lib does not work. There should be some specified way to produce C
.libs,
> linkable by D's link.exe. When I try to supply .lib, produced by MinGW's
> 'ar.exe' or by MSVC's 'lib.exe', DMD's link.exe does not accept it.
> Thanks for answering, anyway!

The problem you're having has nothing to do with C vs D compatibility, it is
because the library you're using is not in OMF format. You could try
COFF2OMF to convert it. If you can get the library to link with DMC, it will
link with D.
August 18, 2004
Re: linking with C libraries
Thanks Ilya, Walter! Now it works.

I compiled FreeType with DMC and it works OK. (Thanks to FreeType's code
quality). It seems to work a bit slower than compiled by GCC or MSVC, but
perhaps I missed some compiler optimization options (I used only -o). Anyway it
works fine. Converting FreeType headers into D modules will be another task of
course.

Aura



Ilya Minkov says...

>You are probably trying to link with .LIB files from the wrong C 
>compiler. DigitalMars D uses the same back-end and binary tools as 
>DigitalMars C and C++, so these tools have to be used, because the file 
>format differs severely from that of Microsoft and MinGW.
>
>Please refer to DMC Compiler and Tools guide from the DigitalMars 
>website on help how to create stub .LIBs from DLLs using implib (basic 
>tools package). If you want a static library, recompile it with DMC, or 
>you can try the commercial advanced utilities package COFF2OMF.


Walter says...

>The problem you're having has nothing to do with C vs D compatibility, it is
>because the library you're using is not in OMF format. You could try
>COFF2OMF to convert it. If you can get the library to link with DMC, it will
>link with D.
Top | Discussion index | About this forum | D home