On Friday, 26 February 2016 at 02:49:20 UTC, Mike Parker wrote:
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.
Great! Thanks.
I was looking for a feature like `jar` files in Java or
`assemblies` in C# where all compiled code and metadata/symbols
are stored together inside a single binary file.
I think same can be implemented for D language and it won't break
any code because it is not touching the language itself, but the
compiler.
Anyway, thanks.