On Thursday, 25 February 2016 at 21:06:59 UTC, mahdi wrote:
On Thursday, 25 February 2016 at 16:45:46 UTC, Chris Wright
Thanks. Is there a way to use a D library without having access
to it's source code? I tried `dmd -lib abcd.d` which creates a
static library. But still I need to specify path to library's
source files using -I option when compiling the code that uses
that library.
So if we have just access to the library file, is it possible
to use it in the code?
The compiler needs to know what symbols are available from any
imports you use in your source. .di files exist to allow closed
source projects to be distributed as binary. They are analagous
to C or C++ header files. You could create them by hand like so:
// foo.d
struct S { int x, y; }
void addTwo(S s) { s.x += 2; s.y += 2; }
// foo.di
struct S { int x, y; }
void addTwo(S s);
The compiler needs to know about S and its types, and it needs to
know the signature of addTwo. The .di file allows you to provide
that while keeping the implementation of addTwo closed. When foo
is imported in client code, the compiler will find foo.di and use
that instead of foo.d.
However, the compiler must have the source for templates, as they
are instantiated when they are used, not when the library is
compiled. The same is true for any functions you want inlined. In
the example above, addTwo can only be inlined when foo.d is used,
since the compiler will not have the implementation with foo.di.