On Monday, 3 October 2016 at 12:08:54 UTC, Chalix wrote:
Furthermore, if there is an not very popular C library, where
no wrapper function exists, would it possible to include it
into a D project? Probably I have to transform all the .h to .d
files, so i can "import" them instead of "include" them. But
then, could I link against the C-library?
Yes, but here you're talking about a binding, not a wrapper.
I did not understand the concept of interaction between C and
D, and I am a bit confused about wrapper functions and bindings
for D now...
Would be great if someone could make it a bit more clear to me
:)
A binding is just the C function declared in D:
// foo.h
extern void my_func(const char *str);
// foo.d
extern(C) void my_func(const(char)* str) @nogc nothrow;
Now with the declaration in D, you can link directly to the C
library. But you also need foo.d to be linked into your program,
either by compiling it alongside your own source files or linking
it as a library (as you do with gtkd-3.lib).
A wrapper takes a C interface and makes it more D like.
// wrapfoo.d
import foo; // import the foo module from above
void myFunc(string s)
{
import std.string : toStringz;
my_func(s.toStringz());
}